diff --git a/README.md b/README.md index 5feb2da..6c54e79 100644 --- a/README.md +++ b/README.md @@ -5,22 +5,7 @@ In [ThinkSpace](http://www.thinkspace.org), faculty use CKEditor to build content in multiple pages called phases which are linked together forming a complex problem for students to solve. CKEditor is great but has typical HTML editor problems and takes work to add new widgets to insert. **Enter ProseMirror**. -The above ProseMirror editor displays a number of widgets which can be inserted into HTML. Insert the desired widget and supply the attributes requested. Tab between fields and press Enter to insert the element. *If you don't supply an attribute nothing will be created.* For most widgets, click on the widget to change the attributes. - -A brief description of the widgets are shown below: - -* **Image** was moved from the inline submenu to implement editing via clicking. Enter **img.png** for a test image. -* **Textfield, Textarea, Checkbox and Select** are used by faculty to prompt for questions in the process of solving a problem. -* **CarryForward** lets an instructor display a student answer from a previous phase(webpage) -* **InlineMath and BlockMath** uses MathJax to display equations. We need these for scientific and engineering problems. -* **Spreadsheet** displays an Excel-like experience for business and engineeroring. Handsontable is used for integration. It also demonstrates how many well-formed javascript toolkits can be used to provide new capabilities. -* **IFrame** lets you embed websites, youTube, GoogleMaps... The sites may not display here because of github.io iframe restrictions. -* **MultipleChoice, CheckList and Scale** form the basis for a Test/Survey/Quiz/Exam document schema. Creating MultipleChoice and CheckList were cumbersome in CKEditor because each individual checkbox and radiobutton had to be inserted. It it now as easy as a bulletlist. It is also easier to enter than GoogleForms and allows the insertion of media in answers which faculty need. For multiplechoice and checklist, insert and click on the empty paragraph that was inserted to type the question stem. Press Enter to add a choice. - -Finally, ThinkSpace supports **team-based learning**. The ProseMirror collaboration capabilities are -ideal for student teams to interact on documents. - -This is exciting! +We are investigating using ProseMirror to provide an HTML editor for instructors and for collaborative editing for student teams. [Pete Boysen](mailto: pboysen@iastate.edu) diff --git a/index.html b/index.html index 520b9a4..df46f42 100644 --- a/index.html +++ b/index.html @@ -1,36 +1,19 @@ - - - -ProseMirror Widgets Examples - -

ProseMirror Widget Examples

-

Caution: These are prototypes which have bugs and need UX and CSS work. Deal with it.

-
-

In ThinkSpace, -faculty use CKEditor to build content in multiple pages called phases which are -linked together forming a complex problem for students to solve. -CKEditor is great but has typical HTML editor problems and takes work to add new widgets to insert. Enter ProseMirror. -

-

-The above ProseMirror editor displays a number of widgets which can be inserted into HTML. -Insert the desired widget and supply the attributes requested. Tab between fields and press Enter to insert the element. -If you don't supply an attribute nothing will be created. -For most widgets, click on the widget to change the attributes. +

Insert a widget and supply its attributes. Click on a widget to change its attributes.

A brief description of the widgets are shown below:

- -

Finally, ThinkSpace supports team-based learning. The ProseMirror collaboration capabilities are -ideal for student teams to interact on documents.

- -

This is exciting!

Source

Pete Boysen

- + diff --git a/upload.jpg b/upload.jpg new file mode 100644 index 0000000..d4a630d Binary files /dev/null and b/upload.jpg differ diff --git a/widgets-built-min.js b/widgets-built-min.js new file mode 100644 index 0000000..53efb1a --- /dev/null +++ b/widgets-built-min.js @@ -0,0 +1,11 @@ +!function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a="function"==typeof require&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;o2?_len-2:0),_key=2;_len>_key;_key++)args[_key-2]=arguments[_key];for(var i=0;i"€"&&(ch.toUpperCase()!=ch.toLowerCase()||nonASCIISingleCaseWordChar.test(ch))}function charCategory(ch){return/\s/.test(ch)?"space":isWordChar(ch)?"word":"other"}function isExtendingChar(ch){return ch.charCodeAt(0)>=768&&extendingChar.test(ch)}Object.defineProperty(exports,"__esModule",{value:!0}),exports.isWordChar=isWordChar,exports.charCategory=charCategory,exports.isExtendingChar=isExtendingChar;var nonASCIISingleCaseWordChar=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/,extendingChar=/[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/},{}],4:[function(require,module,exports){"use strict";function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{"default":obj}}function _toConsumableArray(arr){if(Array.isArray(arr)){for(var i=0,arr2=Array(arr.length);i0;i--){if(!(0,_char.isExtendingChar)(node.text.charAt(i-1)))return offset-1;offset--}else if("word"==by)for(var i=offset-start;i>0;i--){var nextCharCat=(0,_char.charCategory)(node.text.charAt(i-1));if(null==cat||1==counted&&"space"==cat)cat=nextCharCat;else if(cat!=nextCharCat)return offset;offset--,counted++}}}function deleteBarrier(pm,cut){var around=pm.doc.path(cut.path),before=around.child(cut.offset-1),after=around.child(cut.offset);if(!before.type.canContainContent(after.type)||pm.tr.join(cut).apply(andScroll)===!1){var conn=void 0;if(after.isTextblock&&(conn=before.type.findConnection(after.type))){var tr=pm.tr,end=cut.move(1);if(tr.step("ancestor",cut,end,null,{types:[before.type].concat(_toConsumableArray(conn)),attrs:[before.attrs].concat(_toConsumableArray(conn.map(function(){return null})))}),tr.join(end),tr.join(cut),tr.apply(andScroll)!==!1)return}var selAfter=(0,_selection.findSelectionFrom)(pm.doc,cut,1);return pm.tr.lift(selAfter.from,selAfter.to).apply(andScroll)}}function moveForward(parent,offset,by){if("char"!=by&&"word"!=by)throw new Error("Unknown motion unit: "+by);for(var cat=null,counted=0;;){if(offset==parent.size)return offset;var _parent$chunkAfter=parent.chunkAfter(offset),start=_parent$chunkAfter.start,node=_parent$chunkAfter.node;if(!node.isText)return cat?offset:offset+1;if("char"==by)for(var i=offset-start;i=2&&0==from.path[from.path.length-1]&&listType.canContain(doc.path(from.path.slice(0,from.path.length-1)))}function alreadyHasBlockType(doc,from,to,type,attrs){var found=!1;return attrs||(attrs={}),doc.nodesBetween(from,to||from,function(node){return node.isTextblock?(node.hasMarkup(type,attrs)&&(found=!0),!1):void 0}),found}function listTextblockTypes(pm){var cached=pm.schema.cached.textblockTypes;if(cached)return cached;var found=[];for(var _name5 in pm.schema.nodes){var type=pm.schema.nodes[_name5];if(type.textblockTypes)for(var i=0;i0?to:from;return(0,_selection.findSelectionFrom)(pm.doc,node&&node.isBlock?side:side.shorten(null,dir>0?1:0),dir)}function selectNodeHorizontally(pm,dir){var _pm$selection26=pm.selection,empty=_pm$selection26.empty,node=_pm$selection26.node,from=_pm$selection26.from,to=_pm$selection26.to;if(!empty&&!node)return!1;if(node&&node.isInline)return pm.setTextSelection(dir>0?to:from),!0;var parent=void 0;if(!node&&(parent=pm.doc.path(from.path))&&(dir>0?from.offset0?parent.chunkAfter(from.offset):parent.chunkBefore(from.offset),nextNode=_ref.node,start=_ref.start;return nextNode.type.selectable&&start==from.offset-(dir>0?0:1)?(pm.setNodeSelection(0>dir?from.move(-1):from),!0):!1}var next=moveSelectionBlock(pm,dir);return next&&(next instanceof _selection.NodeSelection||node)?(pm.setSelectionDirect(next),!0):!1}function selectNodeVertically(pm,dir){var _pm$selection27=pm.selection,empty=_pm$selection27.empty,node=_pm$selection27.node,from=_pm$selection27.from,to=_pm$selection27.to;if(!empty&&!node)return!1;var leavingTextblock=!0;if((!node||node.isInline)&&(leavingTextblock=(0,_selection.verticalMotionLeavesTextblock)(pm,dir>0?to:from,dir)),leavingTextblock){var next=moveSelectionBlock(pm,dir);if(next&&next instanceof _selection.NodeSelection)return pm.setSelectionDirect(next),node||(pm.sel.lastNonNodePos=from),!0}if(!node)return!1;if(node.isInline)return(0,_selection.setDOMSelectionToPos)(pm,from),!1;var last=pm.sel.lastNonNodePos,beyond=(0,_selection.findSelectionFrom)(pm.doc,0>dir?from:to,dir);return last&&beyond&&_model.Pos.samePath(last.path,beyond.from.path)?((0,_selection.setDOMSelectionToPos)(pm,last),!1):(pm.setSelectionDirect(beyond),!0)}Object.defineProperty(exports,"__esModule",{value:!0});var _slicedToArray=function(){function sliceIterator(arr,i){var _arr=[],_n=!0,_d=!1,_e=void 0;try{for(var _s,_i=arr[Symbol.iterator]();!(_n=(_s=_i.next()).done)&&(_arr.push(_s.value),!i||_arr.length!==i);_n=!0);}catch(err){_d=!0,_e=err}finally{try{!_n&&_i["return"]&&_i["return"]()}finally{if(_d)throw _e}}return _arr}return function(arr,i){if(Array.isArray(arr))return arr;if(Symbol.iterator in Object(arr))return sliceIterator(arr,i);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),_createClass=function(){function defineProperties(target,props){for(var i=0;i0)return!1;for(var before=void 0,cut=void 0,i=head.path.length-1;!before&&i>=0;i--)head.path[i]>0&&(cut=head.shorten(i),before=pm.doc.path(cut.path).child(cut.offset-1));return before?null==before.type.contains?pm.tr["delete"](cut.move(-1),cut).apply(andScroll):deleteBarrier(pm,cut):pm.tr.lift(head).apply(andScroll)},keys:["Backspace(30)","Mod-Backspace(30)"]}),defineCommand({name:"deleteCharBefore",label:"Delete a character before the cursor",run:function(pm){var _pm$selection4=pm.selection,head=_pm$selection4.head,empty=_pm$selection4.empty;if(!empty||0==head.offset)return!1;var from=moveBackward(pm.doc.path(head.path),head.offset,"char");return pm.tr["delete"](new _model.Pos(head.path,from),head).apply(andScroll)},keys:{all:["Backspace(60)"],mac:["Ctrl-H(40)"]}}),defineCommand({name:"deleteWordBefore",label:"Delete the word before the cursor",run:function(pm){var _pm$selection5=pm.selection,head=_pm$selection5.head,empty=_pm$selection5.empty;if(!empty||0==head.offset)return!1;var from=moveBackward(pm.doc.path(head.path),head.offset,"word");return pm.tr["delete"](new _model.Pos(head.path,from),head).apply(andScroll)},keys:{all:["Mod-Backspace(40)"],mac:["Alt-Backspace(40)"]}}),defineCommand({name:"joinForward",label:"Join with the block below",run:function(pm){var _pm$selection6=pm.selection,head=_pm$selection6.head,empty=_pm$selection6.empty;if(!empty||head.offset=0;i--){cut=head.shorten(i,1);var _parent=pm.doc.path(cut.path);cut.offset<_parent.size&&(after=_parent.child(cut.offset))}return after?null==after.type.contains?pm.tr["delete"](cut,cut.move(1)).apply(andScroll):deleteBarrier(pm,cut):!1},keys:["Delete(30)","Mod-Delete(30)"]}),defineCommand({name:"deleteCharAfter",label:"Delete a character after the cursor",run:function(pm){var _pm$selection7=pm.selection,head=_pm$selection7.head,empty=_pm$selection7.empty;if(!empty||head.offset==pm.doc.path(head.path).size)return!1;var to=moveForward(pm.doc.path(head.path),head.offset,"char");return pm.tr["delete"](head,new _model.Pos(head.path,to)).apply(andScroll)},keys:{all:["Delete(60)"],mac:["Ctrl-D(60)"]}}),defineCommand({name:"deleteWordAfter",label:"Delete a word after the cursor",run:function(pm){var _pm$selection8=pm.selection,head=_pm$selection8.head,empty=_pm$selection8.empty;if(!empty||head.offset==pm.doc.path(head.path).size)return!1;var to=moveForward(pm.doc.path(head.path),head.offset,"word");return pm.tr["delete"](head,new _model.Pos(head.path,to)).apply(andScroll)},keys:{all:["Mod-Delete(40)"],mac:["Ctrl-Alt-Backspace(40)","Alt-Delete(40)","Alt-D(40)"]}}),defineCommand({name:"joinUp",label:"Join with above block",run:function(pm){var point=joinPointAbove(pm),isNode=pm.selection.node;return point?(pm.tr.join(point).apply(),void(isNode&&pm.setNodeSelection(point.move(-1)))):!1},select:function(pm){return joinPointAbove(pm)},menuGroup:"block(80)",display:{type:"icon",width:800,height:900,path:"M0 75h800v125h-800z M0 825h800v-125h-800z M250 400h100v-100h100v100h100v100h-100v100h-100v-100h-100z"},keys:["Alt-Up"]}),defineCommand({name:"joinDown",label:"Join with below block",run:function(pm){var node=pm.selection.node,point=joinPointBelow(pm);return point?(pm.tr.join(point).apply(),void(node&&pm.setNodeSelection(point.move(-1)))):!1},select:function(pm){return joinPointBelow(pm)},keys:["Alt-Down"]}),defineCommand({name:"lift",label:"Lift out of enclosing block",run:function(pm){var _pm$selection11=pm.selection,from=_pm$selection11.from,to=_pm$selection11.to;return pm.tr.lift(from,to).apply(andScroll)},select:function(pm){var _pm$selection12=pm.selection,from=_pm$selection12.from,to=_pm$selection12.to;return(0,_transform.canLift)(pm.doc,from,to)},menuGroup:"block(75)",display:{type:"icon",width:1024,height:1024,path:"M219 310v329q0 7-5 12t-12 5q-8 0-13-5l-164-164q-5-5-5-13t5-13l164-164q5-5 13-5 7 0 12 5t5 12zM1024 749v109q0 7-5 12t-12 5h-987q-7 0-12-5t-5-12v-109q0-7 5-12t12-5h987q7 0 12 5t5 12zM1024 530v109q0 7-5 12t-12 5h-621q-7 0-12-5t-5-12v-109q0-7 5-12t12-5h621q7 0 12 5t5 12zM1024 310v109q0 7-5 12t-12 5h-621q-7 0-12-5t-5-12v-109q0-7 5-12t12-5h621q7 0 12 5t5 12zM1024 91v109q0 7-5 12t-12 5h-987q-7 0-12-5t-5-12v-109q0-7 5-12t12-5h987q7 0 12 5t5 12z"},keys:["Alt-Left"]}),_model.NodeType.deriveableCommands.wrap=function(conf){return{run:function(pm){var _pm$selection13=pm.selection,from=_pm$selection13.from,to=_pm$selection13.to,head=_pm$selection13.head,doJoin=!1;if(this.isList&&head&&isAtTopOfListItem(pm.doc,from,to,this)){if(0==from.path[from.path.length-2])return!1;doJoin=!0}var tr=pm.tr.wrap(from,to,this,conf.attrs);return doJoin&&tr.join(from.shorten(from.depth-2)),tr.apply(andScroll)},select:function(pm){var _pm$selection14=pm.selection,from=_pm$selection14.from,to=_pm$selection14.to,head=_pm$selection14.head;return this.isList&&head&&isAtTopOfListItem(pm.doc,from,to,this)&&0==from.path[from.path.length-2]?!1:(0,_transform.canWrap)(pm.doc,from,to,this,conf.attrs)}}},_model.BulletList.register("command",{name:"wrap",derive:!0,labelName:"bullet list",menuGroup:"block(40)",display:{type:"icon",width:768,height:896,path:"M0 512h128v-128h-128v128zM0 256h128v-128h-128v128zM0 768h128v-128h-128v128zM256 512h512v-128h-512v128zM256 256h512v-128h-512v128zM256 768h512v-128h-512v128z"},keys:["Alt-Right '*'","Alt-Right '-'"]}),_model.OrderedList.register("command",{name:"wrap",derive:!0,labelName:"ordered list",menuGroup:"block(41)",display:{type:"icon",width:768,height:896,path:"M320 512h448v-128h-448v128zM320 768h448v-128h-448v128zM320 128v128h448v-128h-448zM79 384h78v-256h-36l-85 23v50l43-2v185zM189 590c0-36-12-78-96-78-33 0-64 6-83 16l1 66c21-10 42-15 67-15s32 11 32 28c0 26-30 58-110 112v50h192v-67l-91 2c49-30 87-66 87-113l1-1z"},keys:["Alt-Right '1'"]}),_model.BlockQuote.register("command",{name:"wrap",derive:!0,labelName:"block quote",menuGroup:"block(45)",display:{type:"icon",width:640,height:896,path:"M0 448v256h256v-256h-128c0 0 0-128 128-128v-128c0 0-256 0-256 256zM640 320v-128c0 0-256 0-256 256v256h256v-256h-128c0 0 0-128 128-128z"},keys:["Alt-Right '>'","Alt-Right '\"'"]}),_model.HardBreak.register("command",{name:"insert",label:"Insert hard break",run:function(pm){var _pm$selection15=pm.selection,node=_pm$selection15.node,from=_pm$selection15.from;return node&&node.isBlock?!1:pm.doc.path(from.path).type.isCode?pm.tr.typeText("\n").apply(andScroll):pm.tr.replaceSelection(this.create()).apply(andScroll)},keys:["Mod-Enter","Shift-Enter"]}),defineCommand({name:"newlineInCode",label:"Insert newline",run:function(pm){var _pm$selection16=pm.selection,from=_pm$selection16.from,to=_pm$selection16.to,node=_pm$selection16.node,block=void 0;return!node&&_model.Pos.samePath(from.path,to.path)&&(block=pm.doc.path(from.path)).type.isCode&&to.offset0||pm.doc.path(head.path).size)return!1; +if(head.depth>1){var shorter=head.shorten();if(shorter.offset>0&&shorter.offset=i;i++)_model.Heading.register("command",{name:"make"+i,derive:{name:"make",attrs:{level:i}},label:"Change to heading "+i,keys:["Mod-H '"+i+"'"]});_model.Paragraph.register("command",{name:"make",derive:!0,label:"Change to paragraph",keys:["Mod-P"]}),_model.CodeBlock.register("command",{name:"make",derive:!0,label:"Change to code block",keys:["Mod-\\"]}),_model.NodeType.deriveableCommands.insert=function(conf){return{run:function(pm){return pm.tr.replaceSelection(this.create(conf.attrs)).apply(andScroll)}}},_model.HorizontalRule.register("command",{name:"insert",derive:!0,label:"Insert horizontal rule",keys:["Mod-Shift--"]}),defineCommand({name:"textblockType",label:"Change block type",run:function(pm,type){var _pm$selection23=pm.selection,from=_pm$selection23.from,to=_pm$selection23.to;return pm.tr.setBlockType(from,to,type.type,type.attrs).apply()},select:function(pm){var node=pm.selection.node;return!node||node.isTextblock},params:[{label:"Type",type:"select",options:listTextblockTypes,"default":currentTextblockType,defaultLabel:"Type..."}],display:{type:"param"},menuGroup:"block(10)"}),_model.Paragraph.prototype.textblockTypes=[{label:"Normal",rank:10}],_model.CodeBlock.prototype.textblockTypes=[{label:"Code",rank:20}],_model.Heading.prototype.textblockTypes=[1,2,3,4,5,6].map(function(n){return{label:"Head "+n,attrs:{level:n},rank:30+n}}),defineCommand({name:"selectParentNode",label:"Select parent node",run:function(pm){var node=nodeAboveSelection(pm);return node?void pm.setNodeSelection(node):!1},select:function(pm){return nodeAboveSelection(pm)},menuGroup:"block(90)",display:{type:"icon",text:"⬚",style:"font-weight: bold; vertical-align: 20%"},keys:["Esc"]}),defineCommand({name:"selectNodeLeft",label:"Move the selection onto or out of the block to the left",run:function(pm){var done=selectNodeHorizontally(pm,-1);return done&&pm.scrollIntoView(),done},keys:["Left","Mod-Left"]}),defineCommand({name:"selectNodeRight",label:"Move the selection onto or out of the block to the right",run:function(pm){var done=selectNodeHorizontally(pm,1);return done&&pm.scrollIntoView(),done},keys:["Right","Mod-Right"]}),defineCommand({name:"selectNodeUp",label:"Move the selection onto or out of the block above",run:function(pm){var done=selectNodeVertically(pm,-1);return done!==!1&&pm.scrollIntoView(),done},keys:["Up"]}),defineCommand({name:"selectNodeDown",label:"Move the selection onto or out of the block below",run:function(pm){var done=selectNodeVertically(pm,1);return done!==!1&&pm.scrollIntoView(),done},keys:["Down"]}),defineCommand({name:"undo",label:"Undo last change",run:function(pm){return pm.scrollIntoView(),pm.history.undo()},select:function(pm){return pm.history.canUndo()},menuGroup:"history(10)",display:{type:"icon",width:1024,height:1024,path:"M761 1024c113-206 132-520-313-509v253l-384-384 384-384v248c534-13 594 472 313 775z"},keys:["Mod-Z"]}),defineCommand({name:"redo",label:"Redo last undone change",run:function(pm){return pm.scrollIntoView(),pm.history.redo()},select:function(pm){return pm.history.canRedo()},menuGroup:"history(20)",display:{type:"icon",width:1024,height:1024,path:"M576 248v-248l384 384-384 384v-253c-446-10-427 303-313 509-280-303-221-789 313-775z"},keys:["Mod-Y","Shift-Mod-Z"]})},{"../dom":1,"../model":30,"../transform":36,"../util/sortedinsert":50,"./char":3,"./selection":14,browserkeymap:51}],5:[function(require,module,exports){"use strict";var _dom=require("../dom");(0,_dom.insertCSS)('\n\n.ProseMirror {\n border: 1px solid silver;\n position: relative;\n}\n\n.ProseMirror-content {\n padding: 4px 8px 4px 14px;\n white-space: pre-wrap;\n line-height: 1.2;\n}\n\n.ProseMirror-drop-target {\n position: absolute;\n width: 1px;\n background: #666;\n display: none;\n}\n\n.ProseMirror-content ul.tight p, .ProseMirror-content ol.tight p {\n margin: 0;\n}\n\n.ProseMirror-content ul, .ProseMirror-content ol {\n padding-left: 30px;\n cursor: default;\n}\n\n.ProseMirror-content blockquote {\n padding-left: 1em;\n border-left: 3px solid #eee;\n margin-left: 0; margin-right: 0;\n}\n\n.ProseMirror-content pre {\n white-space: pre-wrap;\n}\n\n.ProseMirror-selectednode {\n outline: 2px solid #8cf;\n}\n\n.ProseMirror-content p:first-child,\n.ProseMirror-content h1:first-child,\n.ProseMirror-content h2:first-child,\n.ProseMirror-content h3:first-child,\n.ProseMirror-content h4:first-child,\n.ProseMirror-content h5:first-child,\n.ProseMirror-content h6:first-child {\n margin-top: .3em;\n}\n\n/* Add space around the hr to make clicking it easier */\n\n.ProseMirror-content hr {\n position: relative;\n height: 6px;\n border: none;\n}\n\n.ProseMirror-content hr:after {\n content: "";\n position: absolute;\n left: 10px;\n right: 10px;\n top: 2px;\n border-top: 2px solid silver;\n}\n\n.ProseMirror-content img {\n cursor: default;\n}\n\n/* Make sure li selections wrap around markers */\n\n.ProseMirror-content li {\n position: relative;\n pointer-events: none; /* Don\'t do weird stuff with marker clicks */\n}\n.ProseMirror-content li > * {\n pointer-events: auto;\n}\n\nli.ProseMirror-selectednode {\n outline: none;\n}\n\nli.ProseMirror-selectednode:after {\n content: "";\n position: absolute;\n left: -32px;\n right: -2px; top: -2px; bottom: -2px;\n border: 2px solid #8cf;\n pointer-events: none;\n}\n\n')},{"../dom":1}],6:[function(require,module,exports){"use strict";function isAtEnd(node,pos,depth){for(var i=depth||0;i0)return!1;for(var i=depth||0;i0)return!1;return!0}function parseNearSelection(pm){for(var dom=pm.content,node=pm.doc,_pm$selection=pm.selection,from=_pm$selection.from,to=_pm$selection.to,depth=0;;depth++){var toNode=node.child(to.path[depth]),fromStart=isAtStart(from,depth+1),toEnd=isAtEnd(toNode,to,depth+1);if(fromStart||toEnd||from.path[depth]!=to.path[depth]||toNode.isTextblock){var startOffset=depth==from.depth?from.offset:from.path[depth];fromStart&&startOffset>0&&startOffset--;var endOffset=depth==to.depth?to.offset:to.path[depth]+1;toEnd&&endOffset=0;i--){var wrap=pm.doc.path(from.path.slice(0,i));parsed=wrap.replace(from.path[i],parsed)}return parsed}node=toNode,dom=(0,_selection.findByPath)(dom,from.path[depth],!1)}}function applyDOMChange(pm){var updated=parseNearSelection(pm),changeStart=(0,_model.findDiffStart)(pm.doc.content,updated.content);if(changeStart){var changeEnd=findDiffEndConstrained(pm.doc.content,updated.content,changeStart);return pm.markRangeDirty(pm.doc.siblingRange(changeStart,changeEnd.a)),pm.tr.replace(changeStart,changeEnd.a,updated,changeStart,changeEnd.b).apply(),!0}return!1}function offsetBy(first,second,pos){var same=(0,_transformTree.samePathDepth)(first,second),firstEnd=same==first.depth,secondEnd=same==second.depth,off=(secondEnd?second.offset:second.path[same])-(firstEnd?first.offset:first.path[same]),shorter=firstEnd?pos.move(off):pos.shorten(same,off);return secondEnd?shorter:shorter.extend(new _model.Pos(second.path.slice(same),second.offset))}function findDiffEndConstrained(a,b,start){var end=(0,_model.findDiffEnd)(a,b);return end?end.a.cmp(start)<0?{a:start,b:offsetBy(end.a,start,end.b)}:end.b.cmp(start)<0?{a:offsetBy(end.b,start,end.a),b:start}:end:end}function textContext(data){var range=getSelection().getRangeAt(0),start=range.startContainer,end=range.endContainer;if(start==end&&3==start.nodeType){var value=start.nodeValue,lead=range.startOffset,_end=range.endOffset;return data&&_end>=data.length&&value.slice(_end-data.length,_end)==data&&(lead=_end-data.length),{inside:start,lead:lead,trail:value.length-_end}}for(var sizeBefore=null,sizeAfter=null,before=start.childNodes[range.startOffset-1]||nodeBefore(start);before.lastChild;)before=before.lastChild;if(before&&3==before.nodeType){var value=before.nodeValue;sizeBefore=value.length,data&&value.slice(value.length-data.length)==data&&(sizeBefore-=data.length)}for(var after=end.childNodes[range.endOffset]||nodeAfter(end);after.firstChild;)after=after.firstChild;return after&&3==after.nodeType&&(sizeAfter=after.nodeValue.length),{before:before,sizeBefore:sizeBefore,after:after,sizeAfter:sizeAfter}}function textInContext(context,deflt){if(context.inside){var _val=context.inside.nodeValue;return _val.slice(context.lead,_val.length-context.trail)}var before=context.before,after=context.after,val="";if(!before)return deflt;3==before.nodeType&&(val=before.nodeValue.slice(context.sizeBefore));var scan=scanText(before,after);if(null==scan)return deflt;if(val+=scan,after&&3==after.nodeType){var valAfter=after.nodeValue;val+=valAfter.slice(0,valAfter.length-context.sizeAfter)}return val}function nodeAfter(node){for(;;){var next=node.nextSibling;if(next){for(;next.firstChild;)next=next.firstChild;return next}if(!(node=node.parentElement))return null}}function nodeBefore(node){for(;;){var prev=node.previousSibling;if(prev){for(;prev.lastChild;)prev=prev.lastChild;return prev}if(!(node=node.parentElement))return null}}function scanText(start,end){for(var text="",cur=nodeAfter(start);;){if(cur==end)return text;if(!cur)return null;3==cur.nodeType&&(text+=cur.nodeValue),cur=cur.firstChild||nodeAfter(cur)}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.applyDOMChange=applyDOMChange,exports.textContext=textContext,exports.textInContext=textInContext;var _model=require("../model"),_format=require("../format"),_transformTree=require("../transform/tree"),_selection=require("./selection")},{"../format":17,"../model":30,"../transform/tree":44,"./selection":14}],7:[function(require,module,exports){"use strict";function options(path,ranges){return{onRender:function(node,dom,offset){return node.isText||null!=node.type.contains||(dom.contentEditable=!1,node.isBlock&&dom.setAttribute("pm-leaf","true")),node.isBlock&&null!=offset&&dom.setAttribute("pm-offset",offset),node.isTextblock&&adjustTrailingHacks(dom,node),dom},renderInlineFlat:function(node,dom,offset){ranges.advanceTo(new _model.Pos(path,offset));for(var end=new _model.Pos(path,offset+node.width),nextCut=ranges.nextChangeBefore(end),inner=dom,wrapped=void 0,i=0;iversion;)this.addNextMap()}},{key:"addNextMap",value:function(){var found=this.branch.mirror[this.version],mapOffset=this.branch.maps.length-(this.branch.version-this.version)-1,id=this.remap.addToFront(this.branch.maps[mapOffset],this.mirrorBuffer[this.version]);return--this.version,null!=found&&(this.mirrorBuffer[found]=id),id}},{key:"movePastStep",value:function(result){var id=this.addNextMap();result&&this.remap.addToBack(result.map,id)}}]),BranchRemapping}(),workTime=100,pauseTime=150,CompressionWorker=function(){function CompressionWorker(doc,branch,callback){_classCallCheck(this,CompressionWorker),this.branch=branch,this.callback=callback,this.remap=new BranchRemapping(branch),this.doc=doc,this.events=[],this.maps=[],this.version=this.startVersion=branch.version,this.i=branch.events.length,this.timeout=null,this.aborted=!1}return _createClass(CompressionWorker,[{key:"work",value:function(){var _this=this;if(!this.aborted)for(var endTime=Date.now()+workTime;;){if(0==this.i)return this.finish();for(var _event=this.branch.events[--this.i],outEvent=[],j=_event.length-1;j>=0;j--){var _event$j=_event[j],step=_event$j.step,stepVersion=_event$j.version,stepID=_event$j.id;this.remap.moveToVersion(stepVersion);var mappedStep=step.map(this.remap.remap);if(mappedStep&&isDelStep(step)){for(var extra=0,start=step.from;j>0;){var next=_event[j-1];if(next.version!=stepVersion-1||!isDelStep(next.step)||start.cmp(next.step.to))break;extra+=next.step.to.offset-next.step.from.offset,start=next.step.from,stepVersion--,j--,this.remap.addNextMap()}if(extra>0){var _start=mappedStep.from.move(-extra);mappedStep=new _transform.Step("replace",_start,mappedStep.to,_start)}}var result=mappedStep&&mappedStep.apply(this.doc);result&&(this.doc=result.doc,this.maps.push(result.map.invert()),outEvent.push(new InvertedStep(mappedStep,this.version,stepID)),this.version--),this.remap.movePastStep(result)}if(outEvent.length&&(outEvent.reverse(),this.events.push(outEvent)),Date.now()>endTime)return void(this.timeout=window.setTimeout(function(){return _this.work()},pauseTime))}}},{key:"finish",value:function(){this.aborted||(this.events.reverse(),this.maps.reverse(),this.callback(this.maps.concat(this.branch.maps.slice(this.branch.maps.length-(this.branch.version-this.startVersion))),this.events))}},{key:"abort",value:function(){this.aborted=!0,window.clearTimeout(this.timeout)}}]),CompressionWorker}(),compressStepCount=150,Branch=function(){function Branch(maxDepth){_classCallCheck(this,Branch),this.maxDepth=maxDepth,this.version=0,this.nextStepID=1,this.maps=[],this.mirror=Object.create(null),this.events=[],this.stepsSinceCompress=0,this.compressing=null,this.compressTimeout=null}return _createClass(Branch,[{key:"clear",value:function(force){(force||!this.empty())&&(this.maps.length=this.events.length=this.stepsSinceCompress=0,this.mirror=Object.create(null),this.abortCompression())}},{key:"newEvent",value:function(){for(this.abortCompression(),this.events.push([]);this.events.length>this.maxDepth;)this.events.shift()}},{key:"addMap",value:function(map){return this.empty()?void 0:(this.maps.push(map),this.version++,this.stepsSinceCompress++,!0)}},{key:"empty",value:function(){return 0==this.events.length}},{key:"addStep",value:function(step,map,id){this.addMap(map),null==id&&(id=this.nextStepID++),this.events[this.events.length-1].push(new InvertedStep(step,this.version,id))}},{key:"addTransform",value:function(transform,ids){this.abortCompression();for(var i=0;i=0;i--){var invertedStep=event[i],step=invertedStep.step;if(collapsing&&invertedStep.version==remap.version)this.version--,delete this.mirror[this.version],this.maps.pop(),tr.step(step),ids.push(invertedStep.id),--remap.version;else{collapsing=!1,remap.moveToVersion(invertedStep.version),step=step.map(remap.remap);var result=step&&tr.step(step);result&&(ids.push(invertedStep.id),this.addMap(result.map)&&(this.mirror[this.version]=invertedStep.version)),i>0&&remap.movePastStep(result)}}return this.empty()&&this.clear(!0),{transform:tr,ids:ids}}},{key:"getVersion",value:function(){return{id:this.nextStepID,version:this.version}}},{key:"findVersion",value:function(version){for(var i=this.events.length-1;i>=0;i--)for(var _event2=this.events[i],j=_event2.length-1;j>=0;j--){var step=_event2[j];if(step.id==version.id)return{event:i,step:j};if(step.id=0;i--)for(var _event3=this.events[i],j=_event3.length-1;j>=0;j--){var step=_event3[j];if(step.version<=startVersion)break out;var off=positions[step.version-startVersion-1];if(-1==off)_event3.splice(j--,1);else{var inv=rebasedTransform.steps[off].invert(rebasedTransform.docs[off],rebasedTransform.maps[off]);_event3[j]=new InvertedStep(inv,startVersion+newMaps.length+off+1,step.id)}}this.maps.length>positions.length?this.maps=this.maps.slice(0,this.maps.length-positions.length).concat(newMaps).concat(rebasedTransform.maps):this.maps=rebasedTransform.maps.slice(),this.version=startVersion+newMaps.length+rebasedTransform.maps.length,this.stepsSinceCompress+=newMaps.length+rebasedTransform.steps.length-positions.length}}},{key:"abortCompression",value:function(){this.compressing&&(this.compressing.abort(),this.compressing=null)}},{key:"needsCompression",value:function(){return this.stepsSinceCompress>compressStepCount&&!this.compressing}},{key:"startCompression",value:function(doc){var _this2=this;this.compressing=new CompressionWorker(doc,this,function(maps,events){_this2.maps=maps,_this2.events=events,_this2.mirror=Object.create(null),_this2.compressing=null,_this2.stepsSinceCompress=0}),this.compressing.work()}}]),Branch}(),compressDelay=750,History=function(){function History(pm){var _this3=this;_classCallCheck(this,History),this.pm=pm,this.done=new Branch(pm.options.historyDepth),this.undone=new Branch(pm.options.historyDepth),this.lastAddedAt=0,this.ignoreTransform=!1,this.allowCollapsing=!0,pm.on("transform",function(transform,options){return _this3.recordTransform(transform,options)})}return _createClass(History,[{key:"recordTransform",value:function(transform,options){if(!this.ignoreTransform){if(0==options.addToHistory)for(var i=0;ithis.lastAddedAt+this.pm.options.historyEventDelay&&this.done.newEvent(),this.done.addTransform(transform),this.lastAddedAt=now}this.maybeScheduleCompression()}}},{key:"undo",value:function(){return this.shift(this.done,this.undone)}},{key:"redo",value:function(){return this.shift(this.undone,this.done)}},{key:"canUndo",value:function(){return this.done.events.length>0}},{key:"canRedo",value:function(){return this.undone.events.length>0}},{key:"shift",value:function(from,to){var event=from.popEvent(this.pm.doc,this.allowCollapsing);if(!event)return!1;var transform=event.transform,ids=event.ids;return this.ignoreTransform=!0,this.pm.apply(transform),this.ignoreTransform=!1,transform.steps.length?(to&&(to.newEvent(),to.addTransform(transform,ids)),this.lastAddedAt=0,!0):this.shift(from,to)}},{key:"getVersion",value:function(){return this.done.getVersion()}},{key:"backToVersion",value:function(version){var found=this.done.findVersion(version);if(!found)return!1;var event=this.done.events[found.event],combined=this.done.events.slice(found.event+1).reduce(function(comb,arr){return comb.concat(arr)},event.slice(found.step));this.done.events.length=found.event+((event.length=found.step)?1:0),this.done.events.push(combined),this.shift(this.done)}},{key:"rebased",value:function(newMaps,rebasedTransform,positions){this.done.rebased(newMaps,rebasedTransform,positions),this.undone.rebased(newMaps,rebasedTransform,positions),this.maybeScheduleCompression()}},{key:"maybeScheduleCompression",value:function(){this.maybeScheduleCompressionForBranch(this.done),this.maybeScheduleCompressionForBranch(this.undone)}},{key:"maybeScheduleCompressionForBranch",value:function(branch){var _this4=this;window.clearTimeout(branch.compressTimeout),branch.needsCompression()&&(branch.compressTimeout=window.setTimeout(function(){branch.needsCompression()&&branch.startCompression(_this4.pm.doc)},compressDelay))}}]),History}();exports.History=History},{"../model":30,"../transform":36}],9:[function(require,module,exports){"use strict";function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{"default":obj}}Object.defineProperty(exports,"__esModule",{value:!0});var _browserkeymap=require("browserkeymap"),_browserkeymap2=_interopRequireDefault(_browserkeymap),_main=require("./main");Object.defineProperty(exports,"ProseMirror",{enumerable:!0,get:function(){return _main.ProseMirror}});var _options=require("./options");Object.defineProperty(exports,"defineOption",{enumerable:!0,get:function(){return _options.defineOption}});var _selection=require("./selection");Object.defineProperty(exports,"Range",{enumerable:!0,get:function(){return _selection.Range}});var _range=require("./range");Object.defineProperty(exports,"MarkedRange",{enumerable:!0,get:function(){return _range.MarkedRange}});var _commands=require("./commands");Object.defineProperty(exports,"defineCommand",{enumerable:!0,get:function(){return _commands.defineCommand}}),Object.defineProperty(exports,"defineParamHandler",{enumerable:!0,get:function(){return _commands.defineParamHandler}}),Object.defineProperty(exports,"Command",{enumerable:!0,get:function(){return _commands.Command}}),exports.Keymap=_browserkeymap2["default"]},{"./commands":4,"./main":11,"./options":12,"./range":13,"./selection":14,browserkeymap:51}],10:[function(require,module,exports){"use strict";function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{"default":obj}}function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor))throw new TypeError("Cannot call a class as a function")}function dispatchKey(pm,name,e){var seq=pm.input.keySeq;if(seq){if(_browserkeymap2["default"].isModifierKey(name))return!0;clearTimeout(stopSeq),stopSeq=setTimeout(function(){pm.input.keySeq==seq&&(pm.input.keySeq=null)},50),name=seq+" "+name}for(var handle=function handle(bound){if(bound===!1)return"nothing";if("..."==bound)return"multi";if(null==bound)return!1;var result=!1;if(Array.isArray(bound))for(var i=0;result===!1&&i=from.depth&&0==pos.shorten(from.depth).cmp(from)){if(0==from.depth)return pm.sel.pollForUpdate();pos=from.shorten()}pm.setNodeSelection(pos),pm.focus(),e.preventDefault()}function finishComposing(pm){var info=pm.input.composing,text=(0,_domchange.textInContext)(info.context,info.endData),range=(0,_selection.rangeFromDOMLoose)(pm);pm.ensureOperation(),pm.input.composing=null,text!=info.data&&inputText(pm,info.range,text),range&&!range.eq(pm.sel.range)&&pm.setSelectionDirect(range)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function defineProperties(target,props){for(var i=0;inow-lastClick,tripleClick=600>now-oneButLastClick;if(oneButLastClick=lastClick,lastClick=now,tripleClick){e.preventDefault();var pos=(0,_selection.selectableNodeAbove)(pm,e.target,{left:e.clientX,top:e.clientY},!0);if(pos){var node=pm.doc.nodeAfter(pos);if(node.isBlock&&!node.isTextblock)pm.setNodeSelection(pos);else{var path=node.isInline?pos.path:pos.toPath();node.isInline&&(node=pm.doc.path(path)),pm.setTextSelection(new _model.Pos(path,0),new _model.Pos(path,node.size))}pm.focus()}}else{var leaveToBrowser=pm.input.shiftKey||doubleClick,x=e.clientX,y=e.clientY,up=function up(){if(removeEventListener("mouseup",up),removeEventListener("mousemove",move),!(0,_selection.handleNodeClick)(pm,e)){var pos=!leaveToBrowser&&(0,_selection.selectableNodeAbove)(pm,e.target,{left:e.clientX,top:e.clientY});pos?(pm.setNodeSelection(pos),pm.focus()):pm.sel.pollForUpdate()}},move=function(e){!leaveToBrowser&&(Math.abs(x-e.clientX)>4||Math.abs(y-e.clientY)>4)&&(leaveToBrowser=!0),pm.sel.pollForUpdate()};addEventListener("mouseup",up),addEventListener("mousemove",move)}},handlers.touchdown=function(pm){pm.sel.pollForUpdate()};var Composing=function Composing(pm,data){_classCallCheck(this,Composing),this.finished=!1,this.context=(0,_domchange.textContext)(data),this.data=data,this.endData=null;var range=pm.selection;if(data){var path=range.head.path,line=pm.doc.path(path).textContent,found=line.indexOf(data,range.head.offset-data.length);found>-1&&found<=range.head.offset+data.length&&(range=new _selection.TextSelection(new _model.Pos(path,found),new _model.Pos(path,found+data.length)))}this.range=range};handlers.compositionstart=function(pm,e){if(!pm.input.maybeAbortComposition()){pm.flush(),pm.input.composing=new Composing(pm,e.data);var above=pm.selection.head.shorten();pm.markRangeDirty({from:above,to:above.move(1)})}},handlers.compositionupdate=function(pm,e){var info=pm.input.composing;info&&info.data!=e.data&&(info.data=e.data,pm.input.updatingComposition=!0,inputText(pm,info.range,info.data),pm.input.updatingComposition=!1,info.range=new _selection.TextSelection(info.range.from,info.range.from.move(info.data.length)))},handlers.compositionend=function(pm,e){var info=pm.input.composing;info&&(pm.input.composing.finished=!0,pm.input.composing.endData=e.data,setTimeout(function(){pm.input.composing==info&&finishComposing(pm)},20))},handlers.input=function(pm){return pm.input.skipInput?--pm.input.skipInput:pm.input.composing?void(pm.input.composing.finished&&finishComposing(pm)):(pm.sel.stopPollingForUpdate(),(0,_domchange.applyDOMChange)(pm),void pm.scrollIntoView())};var lastCopied=null;handlers.copy=handlers.cut=function(pm,e){var _pm$selection2=pm.selection,from=_pm$selection2.from,to=_pm$selection2.to,empty=_pm$selection2.empty;if(!empty){var fragment=pm.selectedDoc;lastCopied={doc:pm.doc,from:from,to:to,html:(0,_format.toHTML)(fragment),text:(0,_format.toText)(fragment)},e.clipboardData&&(e.preventDefault(),e.clipboardData.clearData(),e.clipboardData.setData("text/html",lastCopied.html),e.clipboardData.setData("text/plain",lastCopied.text),"cut"!=e.type||empty||pm.tr["delete"](from,to).apply())}},handlers.paste=function(pm,e){if(e.clipboardData){var sel=pm.selection,txt=e.clipboardData.getData("text/plain"),html=e.clipboardData.getData("text/html");if(html||txt){e.preventDefault();var doc=void 0,from=void 0,to=void 0;if(pm.input.shiftKey&&txt)doc=(0,_format.fromText)(pm.schema,txt);else if(!lastCopied||lastCopied.html!=html&&lastCopied.text!=txt)doc=html?(0,_format.fromHTML)(pm.schema,html):(0,_format.parseFrom)(pm.schema,txt,(0,_format.knownSource)("markdown")?"markdown":"text");else{var _lastCopied=lastCopied;doc=_lastCopied.doc,from=_lastCopied.from,to=_lastCopied.to}pm.tr.replace(sel.from,sel.to,doc,from||(0,_selection.findSelectionAtStart)(doc).from,to||(0,_selection.findSelectionAtEnd)(doc).to).apply(),pm.scrollIntoView()}}},handlers.dragstart=function(pm,e){if(e.dataTransfer){var fragment=pm.selectedDoc;e.dataTransfer.setData("text/html",(0,_format.toHTML)(fragment)),e.dataTransfer.setData("text/plain",(0,_format.toText)(fragment)),pm.input.draggingFrom=!0}},handlers.dragend=function(pm){return window.setTimeout(function(){return pm.input.dragginFrom=!1},50)},handlers.dragover=handlers.dragenter=function(pm,e){e.preventDefault();var cursorPos=pm.posAtCoords({left:e.clientX,top:e.clientY});if(cursorPos){var coords=(0,_selection.coordsAtPos)(pm,cursorPos),rect=pm.wrapper.getBoundingClientRect();coords.top-=rect.top,coords.right-=rect.left,coords.bottom-=rect.top,coords.left-=rect.left;var target=pm.input.dropTarget;target.style.display="block",target.style.left=coords.left-1+"px",target.style.top=coords.top+"px",target.style.height=coords.bottom-coords.top+"px"}},handlers.dragleave=function(pm){return pm.input.dropTarget.style.display=""},handlers.drop=function(pm,e){if(pm.input.dropTarget.style.display="",e.dataTransfer){var html=void 0,txt=void 0,doc=void 0;if((html=e.dataTransfer.getData("text/html"))?doc=(0,_format.fromHTML)(pm.schema,html,{document:document}):(txt=e.dataTransfer.getData("text/plain"))&&(doc=(0,_format.parseFrom)(pm.schema,txt,(0,_format.knownSource)("markdown")?"markdown":"text")),doc){e.preventDefault();var insertPos=pm.posAtCoords({left:e.clientX,top:e.clientY});if(!insertPos)return;var tr=pm.tr;pm.input.draggingFrom&&!e.ctrlKey&&(tr.deleteSelection(),insertPos=tr.map(insertPos).pos),tr.replace(insertPos,insertPos,doc,(0,_selection.findSelectionAtStart)(doc).from,(0,_selection.findSelectionAtEnd)(doc).to).apply(),pm.setTextSelection(insertPos,tr.map(insertPos).pos),pm.focus()}}},handlers.focus=function(pm){(0,_dom.addClass)(pm.wrapper,"ProseMirror-focused"),pm.signal("focus")},handlers.blur=function(pm){(0,_dom.rmClass)(pm.wrapper,"ProseMirror-focused"),pm.signal("blur")}},{"../dom":1,"../format":17,"../model":30,"./capturekeys":2,"./domchange":6,"./selection":14,browserkeymap:51}],11:[function(require,module,exports){"use strict";function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{"default":obj}}function _inherits(subClass,superClass){if("function"!=typeof superClass&&null!==superClass)throw new TypeError("Super expression must either be null or a function, not "+typeof superClass);subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,enumerable:!1,writable:!0,configurable:!0}}),superClass&&(Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__=superClass)}function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(exports,"__esModule",{value:!0});var _get=function(_x4,_x5,_x6){for(var _again=!0;_again;){var object=_x4,property=_x5,receiver=_x6;_again=!1,null===object&&(object=Function.prototype);var desc=Object.getOwnPropertyDescriptor(object,property);if(void 0!==desc){if("value"in desc)return desc.value;var getter=desc.get;if(void 0===getter)return;return getter.call(receiver)}var parent=Object.getPrototypeOf(object);if(null===parent)return;_x4=parent,_x5=property,_x6=receiver,_again=!0,desc=parent=void 0}},_createClass=function(){function defineProperties(target,props){for(var i=0;i=parent.size)throw new Error("Trying to set a node selection at the end of a node");var node=parent.child(pos.offset);if(!node.type.selectable)throw new Error("Trying to select a non-selectable node");this.input.maybeAbortComposition(),this.sel.setAndSignal(new _selection2.NodeSelection(pos,pos.move(1),node))}},{key:"setSelection",value:function(selection){selection instanceof _selection2.TextSelection?(this.checkPos(selection.head,!0),selection.empty||this.checkPos(selection.anchor,!0)):this.checkPos(selection.to,!1),this.setSelectionDirect(selection)}},{key:"setSelectionDirect",value:function(selection){this.ensureOperation(),this.input.maybeAbortComposition(),selection.eq(this.sel.range)||this.sel.setAndSignal(selection)}},{key:"setContent",value:function(value,format){format&&(value=(0,_format.parseFrom)(this.schema,value,format)),this.setDoc(value)}},{key:"getContent",value:function(format){return format?(0,_format.serializeTo)(this.doc,format):this.doc}},{key:"setDocInner",value:function(doc){if(doc.type!=this.schema.nodes.doc)throw new Error("Trying to set a document with a different schema");this.doc=doc,this.ranges=new _range.RangeStore(this),this.history=new _history.History(this)}},{key:"setDoc",value:function(doc,sel){sel||(sel=(0,_selection2.findSelectionAtStart)(doc)),this.signal("beforeSetDoc",doc,sel),this.ensureOperation(),this.setDocInner(doc),this.sel.set(sel,!0),this.signal("setDoc",doc,sel)}},{key:"updateDoc",value:function(doc,mapping,selection){this.ensureOperation(),this.input.maybeAbortComposition(),this.ranges.transform(mapping),this.doc=doc,this.sel.setAndSignal(selection||this.sel.range.map(doc,mapping)),this.signal("change")}},{key:"apply",value:function(transform){var options=arguments.length<=1||void 0===arguments[1]?nullOptions:arguments[1];if(transform.doc==this.doc)return!1;if(transform.docs[0]!=this.doc&&(0,_model.findDiffStart)(transform.docs[0],this.doc))throw new Error("Applying a transform that does not start with the current document");return this.updateDoc(transform.doc,transform,options.selection),this.signal("transform",transform,options),options.scrollIntoView&&this.scrollIntoView(),transform}},{key:"checkPos",value:function(pos,textblock){if(!this.doc.isValidPos(pos,textblock))throw new Error("Position "+pos+" is not valid in current document")}},{key:"ensureOperation",value:function(){return this.operation||this.startOperation()}},{key:"startOperation",value:function(){var _this=this;return this.sel.beforeStartOp(),this.operation=new Operation(this),this.flushScheduled||((0,_dom.requestAnimationFrame)(function(){_this.flushScheduled=!1,_this.flush()}),this.flushScheduled=!0),this.operation}},{key:"flush",value:function(){if(document.body.contains(this.wrapper)&&this.operation){this.signal("flushing");var op=this.operation;if(op){this.operation=null,this.accurateSelection=!0;var docChanged=op.doc!=this.doc||this.dirtyNodes.size,redrawn=!1;this.input.composing||!docChanged&&!op.composingAtStart||((0,_draw.redraw)(this,this.dirtyNodes,this.doc,op.doc),this.dirtyNodes.clear(),redrawn=!0),!redrawn&&op.sel.eq(this.sel.range)||this.input.composing||this.sel.toDOM(op.focus),op.scrollIntoView!==!1&&(0,_selection2.scrollIntoView)(this,op.scrollIntoView),docChanged&&this.signal("draw"),this.signal("flush"),this.signal("flushed"),this.accurateSelection=!1}}}},{key:"addKeymap",value:function(map){var rank=arguments.length<=1||void 0===arguments[1]?50:arguments[1];(0,_utilSortedinsert2["default"])(this.input.keymaps,{map:map,rank:rank},function(a,b){return a.rank-b.rank})}},{key:"removeKeymap",value:function(map){for(var maps=this.input.keymaps,i=0;i-1:deflt==name)return this.commandKeys[name]=key}for(var _key in keymap.bindings){var bound=keymap.bindings[_key];if(Array.isArray(bound)?bound.indexOf(name)>-1:bound==name)return this.commandKeys[name]=_key}return this.commandKeys[name]=null}},{key:"markRangeDirty",value:function(range){this.ensureOperation();for(var dirty=this.dirtyNodes,from=range.from,to=range.to,depth=0,node=this.doc;;depth++){var fromEnd=depth==from.depth,toEnd=depth==to.depth;if(fromEnd||toEnd||from.path[depth]!=to.path[depth]){var _ret=function(){var start=fromEnd?from.offset:from.path[depth],end=toEnd?to.offset:to.path[depth]+1;if(node.isTextblock)node.forEach(function(child,cStart,cEnd){end>cStart&&cEnd>start&&dirty.set(child,DIRTY_REDRAW)});else for(var i=node.iter(start,end),child=void 0;child=i.next().value;)dirty.set(child,DIRTY_REDRAW);return"break"}();if("break"===_ret)break}else{var child=node.child(from.path[depth]);dirty.has(child)||dirty.set(child,DIRTY_RESCAN),node=child}}}},{key:"selection",get:function(){return this.accurateSelection||this.ensureOperation(),this.sel.range}},{key:"tr",get:function(){return new EditorTransform(this)}},{key:"selectedDoc",get:function(){var sel=this.selection;return this.doc.sliceBetween(sel.from,sel.to)}},{key:"selectedText",get:function(){return(0,_format.toText)(this.selectedDoc)}}]),ProseMirror}();exports.ProseMirror=ProseMirror;var DIRTY_RESCAN=1,DIRTY_REDRAW=2;exports.DIRTY_RESCAN=DIRTY_RESCAN,exports.DIRTY_REDRAW=DIRTY_REDRAW;var nullOptions={};(0,_utilEvent.eventMixin)(ProseMirror);var Operation=function Operation(pm){_classCallCheck(this,Operation),this.doc=pm.doc,this.sel=pm.sel.range,this.scrollIntoView=!1,this.focus=!1,this.composingAtStart=!!pm.input.composing},EditorTransform=function(_Transform){function EditorTransform(pm){_classCallCheck(this,EditorTransform),_get(Object.getPrototypeOf(EditorTransform.prototype),"constructor",this).call(this,pm.doc),this.pm=pm}return _inherits(EditorTransform,_Transform),_createClass(EditorTransform,[{key:"apply",value:function(options){return this.pm.apply(this,options)}},{key:"replaceSelection",value:function(node,inheritMarks){var _selection=this.selection,empty=_selection.empty,from=_selection.from,to=_selection.to,selNode=_selection.node,parent=void 0;if(node&&node.isInline&&inheritMarks!==!1){var marks=empty?this.pm.input.storedMarks:this.doc.marksAt(from);node=node.type.create(node.attrs,node.text,marks)}if(selNode&&selNode.isTextblock&&node&&node.isInline)from=new _model.Pos(from.toPath(),0),to=new _model.Pos(from.path,selNode.size);else if(selNode)for(;from.depth&&0==from.offset&&(parent=this.doc.path(from.path))&&from.offset==parent.size-1&&!parent.type.canBeEmpty&&(!node||!parent.type.canContain(node));)from=from.shorten(),to=to.shorten(null,1);else if(node&&node.isBlock&&this.doc.path(from.path.slice(0,from.depth-1)).type.canContain(node)){this["delete"](from,to);var _parent=this.doc.path(from.path);return from.offset&&from.offset!=_parent.size&&this.split(from),this.insert(from.shorten(null,from.offset?1:0),node)}return node?this.replaceWith(from,to,node):this["delete"](from,to)}},{key:"deleteSelection",value:function(){return this.replaceSelection()}},{key:"typeText",value:function(text){return this.replaceSelection(this.pm.schema.text(text),!0)}},{key:"selection",get:function(){return this.steps.length?this.pm.selection.map(this):this.pm.selection}}]),EditorTransform}(_transform.Transform)},{"../dom":1,"../format":17,"../model":30,"../transform":36,"../util/event":48,"../util/map":49,"../util/sortedinsert":50,"./commands":4,"./css":5,"./draw":7,"./history":8,"./input":10,"./options":12,"./range":13,"./selection":14,browserkeymap:51}],12:[function(require,module,exports){"use strict";function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor))throw new TypeError("Cannot call a class as a function")}function defineOption(name,defaultValue,update,updateOnInit){options[name]=new Option(defaultValue,update,updateOnInit)}function parseOptions(obj){var result=Object.create(null),given=obj?[obj].concat(obj.use||[]):[];outer:for(var opt in options){for(var i=0;imax){for(var i=min;max>i;i++)if(this.sorted[i].at.cmp(at)>=0)return i;return max}var mid=min+max>>1;this.sorted[mid].at.cmp(at)>0?max=mid:min=mid}}},{key:"insert",value:function(obj){this.sorted.splice(this.find(obj.at),0,obj)}},{key:"remove",value:function(at,range){for(var pos=this.find(at),dist=0;;dist++){var leftPos=pos-dist-1,rightPos=pos+dist;if(leftPos>=0&&this.sorted[leftPos].range==range)return void this.sorted.splice(leftPos,1);if(rightPos0&&this.sorted[pos-1].at.cmp(at)>0;)this.sorted[pos]=this.sorted[pos-1],this.sorted[--pos]=cur}}]),RangeSorter}(),RangeStore=function(){function RangeStore(pm){_classCallCheck(this,RangeStore),this.pm=pm,this.ranges=[],this.sorted=new RangeSorter}return _createClass(RangeStore,[{key:"addRange",value:function(range){this.ranges.push(range),this.sorted.insert({type:"open",at:range.from,range:range}),this.sorted.insert({type:"close",at:range.to,range:range}),this.pm.markRangeDirty(range)}},{key:"removeRange",value:function(range){var found=this.ranges.indexOf(range);found>-1&&(this.ranges.splice(found,1),this.sorted.remove(range.from,range),this.sorted.remove(range.to,range),this.pm.markRangeDirty(range),range.remove())}},{key:"transform",value:function(mapping){for(var i=0;i=0?(this.removeRange(range),i--):diff>0&&(range.to=range.from)}this.sorted.resort()}},{key:"activeRangeTracker",value:function(){return new RangeTracker(this.sorted.sorted)}}]),RangeStore}();exports.RangeStore=RangeStore;var RangeTracker=function(){function RangeTracker(sorted){_classCallCheck(this,RangeTracker),this.sorted=sorted,this.pos=0,this.current=[]}return _createClass(RangeTracker,[{key:"advanceTo",value:function(pos){for(var next=void 0;this.pos=0?null:next.at.offset;this.pos++}}}]),RangeTracker}()},{"../util/event":48}],14:[function(require,module,exports){"use strict";function _inherits(subClass,superClass){if("function"!=typeof superClass&&null!==superClass)throw new TypeError("Super expression must either be null or a function, not "+typeof superClass);subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,enumerable:!1,writable:!0,configurable:!0}}),superClass&&(Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__=superClass)}function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor))throw new TypeError("Cannot call a class as a function")}function clearNodeSelection(dom){dom.classList.remove("ProseMirror-selectednode")}function addNodeSelection(_node,dom){dom.classList.add("ProseMirror-selectednode")}function windowRect(){return{left:0,right:window.innerWidth,top:0,bottom:window.innerHeight}}function pathFromDOM(pm,node){for(var path=[];node!=pm.content;){var attr=node.getAttribute("pm-offset");attr&&path.unshift(+attr),node=node.parentNode}return path}function widthFromDOM(dom){var attr=dom.getAttribute("pm-leaf");return attr&&"true"!=attr?+attr:1}function posFromDOMInner(pm,dom,domOffset,loose){if(!loose&&pm.operation&&pm.doc!=pm.operation.doc)throw new Error("Fetching a position from an outdated DOM structure");for(var extraOffset=0,tag=void 0;;){var adjust=0;if(3==dom.nodeType)extraOffset+=domOffset;else{if(dom.hasAttribute("pm-offset")||dom==pm.content)break;(tag=dom.getAttribute("pm-inner-offset"))?(extraOffset+=+tag,adjust=-1):domOffset&&domOffset==dom.childNodes.length&&(adjust=1)}var _parent=dom.parentNode;domOffset=0>adjust?0:Array.prototype.indexOf.call(_parent.childNodes,dom)+adjust,dom=_parent}var path=pathFromDOM(pm,dom);if(dom.hasAttribute("pm-leaf"))return _model.Pos.from(path,extraOffset+(domOffset?1:0));for(var offset=0,i=domOffset-1;i>=0;i--){var child=dom.childNodes[i];if(3==child.nodeType)loose&&(extraOffset+=child.nodeValue.length);else{if(tag=child.getAttribute("pm-offset")){offset=+tag+widthFromDOM(child);break}loose&&!child.hasAttribute("pm-ignore")&&(extraOffset+=child.textContent.length)}}return new _model.Pos(path,offset+extraOffset)}function posFromDOM(pm,node,offset){return null==offset&&(offset=Array.prototype.indexOf.call(node.parentNode.childNodes,node),node=node.parentNode),posFromDOMInner(pm,node,offset)}function rangeFromDOMLoose(pm){if(!hasFocus(pm))return null;var sel=getSelection();return new TextSelection(posFromDOMInner(pm,sel.anchorNode,sel.anchorOffset,!0),posFromDOMInner(pm,sel.focusNode,sel.focusOffset,!0))}function findByPath(node,n,fromEnd){for(var ch=fromEnd?node.lastChild:node.firstChild;ch;ch=fromEnd?ch.previousSibling:ch.nextSibling)if(1==ch.nodeType){var offset=ch.getAttribute("pm-offset");if(offset){if(+offset==n)return ch}else{var found=findByPath(ch,n);if(found)return found}}}function resolvePath(parent,path){for(var node=parent,i=0;i=0&&(after?width>=diff:width>diff))return{node:ch,offset:i,innerOffset:diff}}else{var result=search(ch);if(result)return result}}return search(node)}function leafAt(node,offset){for(;;){var child=node.firstChild;if(!child)return{node:node,offset:offset};if(1!=child.nodeType)return{node:child,offset:offset};if(child.hasAttribute("pm-inner-offset")){for(var nodeOffset=0;;){var nextSib=child.nextSibling,nextOffset=void 0;if(!nextSib||(nextOffset=+nextSib.getAttribute("pm-inner-offset"))>=offset)break;child=nextSib,nodeOffset=nextOffset}offset-=nodeOffset}node=child}}function DOMFromPos(parent,pos){var dom=resolvePath(parent,pos.path),found=findByOffset(dom,pos.offset,!0),inner=void 0;return found?"true"!=found.node.getAttribute("pm-leaf")&&(inner=leafAt(found.node,found.innerOffset))?inner:{node:found.node.parentNode,offset:found.offset+(found.innerOffset?1:0)}:{node:dom,offset:0}}function hasFocus(pm){var sel=window.getSelection();return sel.rangeCount&&(0,_dom.contains)(pm.content,sel.anchorNode)}function posAtCoords(pm,coords){var element=document.elementFromPoint(coords.left,coords.top+1);if(!(0,_dom.contains)(pm.content,element))return null;var offset=void 0;return 1==element.childNodes.length&&3==element.firstChild.nodeType?(element=element.firstChild,offset=offsetInTextNode(element,coords)):offset=offsetInElement(element,coords),posFromDOM(pm,element,offset)}function textRect(node,from,to){var range=document.createRange();return range.setEnd(node,to),range.setStart(node,from),range.getBoundingClientRect()}function coordsAtPos(pm,pos){var _DOMFromPos=DOMFromPos(pm.content,pos),node=_DOMFromPos.node,offset=_DOMFromPos.offset,side=void 0,rect=void 0;if(3==node.nodeType)offsetrect.bottom&&(moveY=coords.bottom-rect.bottom+scrollMargin), +coords.leftrect.right&&(moveX=coords.right-rect.right+scrollMargin),moveX||moveY?atBody&&window.scrollBy(moveX,moveY):(moveY&&(_parent2.scrollTop+=moveY),moveX&&(_parent2.scrollLeft+=moveX)),atBody)break}}function offsetInRects(coords,rects,strict){for(var y=coords.top,x=coords.left,minY=1e8,minX=1e8,offset=0,i=0;irect.right?x-rect.right:0;if(!(dX>minX)){minX>dX&&(minX=dX,minY=1e8);var dY=yrect.bottom?y-rect.bottom:0;minY>dY&&(minY=dY,offset=x<(rect.left+rect.right)/2?i:i+1)}}}return strict&&(minX||minY)?null:offset}function offsetInTextNode(text,coords,strict){for(var len=text.nodeValue.length,range=document.createRange(),rects=[],i=0;len>i;i++)range.setEnd(text,i+1),range.setStart(text,i),rects.push(range.getBoundingClientRect());return offsetInRects(coords,rects,strict)}function offsetInElement(element,coords){for(var rects=[],child=element.firstChild;child;child=child.nextSibling)child.getBoundingClientRect?rects.push(child.getBoundingClientRect()):rects.push(null);return offsetInRects(coords,rects)}function findSelectionIn(doc,path,offset,dir,text){var node=doc.path(path);if(node.isTextblock)return new TextSelection(new _model.Pos(path,offset));for(var i=offset+(dir>0?0:-1);dir>0?i=0;i+=dir){var child=node.child(i);if(!text&&null==child.type.contains&&child.type.selectable)return new NodeSelection(new _model.Pos(path,i),new _model.Pos(path,i+1),child);path.push(i);var inside=findSelectionIn(doc,path,0>dir?child.size:0,dir,text);if(inside)return inside;path.pop()}}function findSelectionFrom(doc,pos,dir,text){for(var path=pos.path.slice(),offset=pos.offset;;){var found=findSelectionIn(doc,path,offset,dir,text);if(found)return found;if(!path.length)break;offset=path.pop()+(dir>0?1:0)}}function findSelectionNear(doc,pos,bias,text){void 0===bias&&(bias=1);var result=findSelectionFrom(doc,pos,bias,text)||findSelectionFrom(doc,pos,-bias,text);if(!result)throw new Error("Searching for selection in invalid document "+doc);return result}function findSelectionAtStart(node,path,text){return void 0===path&&(path=[]),findSelectionIn(node,path.slice(),0,1,text)}function findSelectionAtEnd(node,path,text){return void 0===path&&(path=[]),findSelectionIn(node,path.slice(),node.size,-1,text)}function selectableNodeAbove(pm,dom,coords,liberal){for(;dom&&dom!=pm.content;dom=dom.parentNode)if(dom.hasAttribute("pm-offset")){var path=pathFromDOM(pm,dom),node=pm.doc.path(path);if(node.type.countCoordsAsChild){var result=node.type.countCoordsAsChild(node,path,dom,coords);if(result)return result}if((liberal||null==node.type.contains)&&node.type.selectable)return _model.Pos.from(path);if(!liberal)return null}}function handleNodeClick(pm,event){for(var dom=event.target;dom&&dom!=pm.content;dom=dom.parentNode)if(dom.hasAttribute("pm-offset")){var path=pathFromDOM(pm,dom),node=pm.doc.path(path);return node.type.handleClick&&node.type.handleClick(pm,event,path,node)!==!1}}function verticalMotionLeavesTextblock(pm,pos,dir){for(var dom=resolvePath(pm.content,pos.path),coords=coordsAtPos(pm,pos),child=dom.firstChild;child;child=child.nextSibling)if(1==child.nodeType)for(var boxes=child.getClientRects(),i=0;idir?box.bottomcoords.bottom)return!1}return!0}function setDOMSelectionToPos(pm,pos){var _DOMFromPos2=DOMFromPos(pm.content,pos),node=_DOMFromPos2.node,offset=_DOMFromPos2.offset,range=document.createRange();range.setEnd(node,offset),range.setStart(node,offset);var sel=getSelection();sel.removeAllRanges(),sel.addRange(range)}Object.defineProperty(exports,"__esModule",{value:!0});var _get=function(_x,_x2,_x3){for(var _again=!0;_again;){var object=_x,property=_x2,receiver=_x3;_again=!1,null===object&&(object=Function.prototype);var desc=Object.getOwnPropertyDescriptor(object,property);if(void 0!==desc){if("value"in desc)return desc.value;var getter=desc.get;if(void 0===getter)return;return getter.call(receiver)}var parent=Object.getPrototypeOf(object);if(null===parent)return;_x=parent,_x2=property,_x3=receiver,_again=!0,desc=parent=void 0}},_createClass=function(){function defineProperties(target,props){for(var i=0;i0){var tmp=anchor;anchor=head,head=tmp}range.setEnd(head.node,head.offset),range.setStart(anchor.node,anchor.offset)}sel.removeAllRanges(),sel.addRange(range),sel.extend&&sel.extend(head.node,head.offset),this.storeDOMState()}}},{key:"receivedFocus",value:function(){this.pollState||this.pollToSync()}},{key:"beforeStartOp",value:function(){"update"==this.pollState&&this.readUpdate()?(clearTimeout(this.pollTimeout),this.stopPollingForUpdate()):this.syncDOM()}}]),SelectionState}();exports.SelectionState=SelectionState;var Selection=function Selection(){_classCallCheck(this,Selection)};exports.Selection=Selection;var TextSelection=function(_Selection){function TextSelection(anchor,head){_classCallCheck(this,TextSelection),_get(Object.getPrototypeOf(TextSelection.prototype),"constructor",this).call(this),this.anchor=anchor,this.head=head||anchor}return _inherits(TextSelection,_Selection),_createClass(TextSelection,[{key:"eq",value:function(other){return other instanceof TextSelection&&!other.head.cmp(this.head)&&!other.anchor.cmp(this.anchor)}},{key:"map",value:function(doc,mapping){var head=mapping.map(this.head).pos;if(!doc.path(head.path).isTextblock)return findSelectionNear(doc,head);var anchor=mapping.map(this.anchor).pos;return new TextSelection(doc.path(anchor.path).isTextblock?anchor:head,head)}},{key:"inverted",get:function(){return this.anchor.cmp(this.head)>0}},{key:"from",get:function(){return this.inverted?this.head:this.anchor}},{key:"to",get:function(){return this.inverted?this.anchor:this.head}},{key:"empty",get:function(){return 0==this.anchor.cmp(this.head)}}]),TextSelection}(Selection);exports.TextSelection=TextSelection;var NodeSelection=function(_Selection2){function NodeSelection(from,to,node){_classCallCheck(this,NodeSelection),_get(Object.getPrototypeOf(NodeSelection.prototype),"constructor",this).call(this),this.from=from,this.to=to,this.node=node}return _inherits(NodeSelection,_Selection2),_createClass(NodeSelection,[{key:"eq",value:function(other){return other instanceof NodeSelection&&!this.from.cmp(other.from)}},{key:"map",value:function(doc,mapping){var from=mapping.map(this.from,1).pos,to=mapping.map(this.to,-1).pos;if(_model.Pos.samePath(from.path,to.path)&&from.offset==to.offset-1){var node=doc.nodeAfter(from);if(node.type.selectable)return new NodeSelection(from,to,node)}return findSelectionNear(doc,from)}},{key:"empty",get:function(){return!1}}]),NodeSelection}(Selection);exports.NodeSelection=NodeSelection;var scrollMargin=5},{"../dom":1,"../model":30}],15:[function(require,module,exports){"use strict";function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor))throw new TypeError("Cannot call a class as a function")}function fromDOM(schema,dom,options){options||(options={});var context=new DOMParseState(schema,options.topNode||schema.node("doc"),options),start=options.from?dom.childNodes[options.from]:dom.firstChild,end=null!=options.to&&dom.childNodes[options.to]||null;context.addAll(start,end,!0);for(var doc=void 0;context.stack.length;)doc=context.leave();return doc}function fromHTML(schema,html,options){var wrap=(options&&options.document||window.document).createElement("div");return wrap.innerHTML=html,fromDOM(schema,wrap,options)}function nodeInfo(schema){return schema.cached.parseDOMNodes||(schema.cached.parseDOMNodes=summarizeNodeInfo(schema))}function summarizeNodeInfo(schema){var tags=Object.create(null);tags._=[],schema.registry("parseDOM",function(info,type){var tag=info.tag||"_",parse=info.parse;"block"==parse?parse=function(dom,state){state.wrapIn(dom,this)}:"mark"==parse&&(parse=function(dom,state){state.wrapMark(dom,this)}),(tags[tag]||(tags[tag]=[])).push({type:type,parse:parse,rank:null==info.rank?50:info.rank})});for(var tag in tags)tags[tag].sort(function(a,b){return a.rank-b.rank});return tags}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function defineProperties(target,props){for(var i=0;i=0;i--){var route=this.stack[i].type.findConnection(node.type);if(route){if(i==this.stack.length-1)this.doClose();else for(;this.stack.length>i+1;)this.leave();for(var j=0;jstack.length;)this.leave();for(;;){var n=this.stack.length-1,one=this.stack[n],two=stack[n];if(one.type==two.type&&_model.Node.sameAttrs(one.attrs,two.attrs))break;this.leave()}for(;stack.length>this.stack.length;){var add=stack[this.stack.length];this.enter(add.type,add.attrs)}this.marks.length&&(this.marks=noMarks),this.closing=!1}},{key:"wrapIn",value:function(dom,type,attrs){this.enter(type,attrs),this.addAll(dom.firstChild,null,!0),this.leave()}},{key:"wrapMark",value:function(dom,mark){var old=this.marks;this.marks=(mark.instance||mark).addToSet(old),this.addAll(dom.firstChild,null),this.marks=old}},{key:"top",get:function(){return this.stack[this.stack.length-1]}}]),DOMParseState}();_model.Paragraph.register("parseDOM",{tag:"p",parse:"block"}),_model.BlockQuote.register("parseDOM",{tag:"blockquote",parse:"block"});for(var _loop=function(i){_model.Heading.register("parseDOM",{tag:"h"+i,parse:function(dom,state){state.wrapIn(dom,this,{level:i})}})},i=1;6>=i;i++)_loop(i);_model.HorizontalRule.register("parseDOM",{tag:"hr",parse:"block"}),_model.CodeBlock.register("parseDOM",{tag:"pre",parse:function(dom,state){var params=dom.firstChild&&/^code$/i.test(dom.firstChild.nodeName)&&dom.firstChild.getAttribute("class");if(params&&/fence/.test(params)){for(var found=[],re=/(?:^|\s)lang-(\S+)/g,m=void 0;m=re.test(params);)found.push(m[1]);params=found.join(" ")}else params=null;var text=dom.textContent;state.insert(this,{params:params},text?[state.schema.text(text)]:[])}}),_model.BulletList.register("parseDOM",{tag:"ul",parse:"block"}),_model.OrderedList.register("parseDOM",{tag:"ol",parse:function(dom,state){var attrs={order:dom.getAttribute("start")||1};state.wrapIn(dom,this,attrs)}}),_model.ListItem.register("parseDOM",{tag:"li",parse:"block"}),_model.HardBreak.register("parseDOM",{tag:"br",parse:function(_,state){state.insert(this)}}),_model.Image.register("parseDOM",{tag:"img",parse:function(dom,state){state.insert(this,{src:dom.getAttribute("src"),title:dom.getAttribute("title")||null,alt:dom.getAttribute("alt")||null})}}),_model.LinkMark.register("parseDOM",{tag:"a",parse:function(dom,state){var href=dom.getAttribute("href");return href?void state.wrapMark(dom,this.create({href:href,title:dom.getAttribute("title")})):!1}}),_model.EmMark.register("parseDOM",{tag:"i",parse:"mark"}),_model.EmMark.register("parseDOM",{tag:"em",parse:"mark"}),_model.StrongMark.register("parseDOM",{tag:"b",parse:"mark"}),_model.StrongMark.register("parseDOM",{tag:"strong",parse:"mark"}),_model.CodeMark.register("parseDOM",{tag:"code",parse:"mark"})},{"../model":30,"./register":18}],16:[function(require,module,exports){"use strict";function fromText(schema,text){for(var blocks=text.trim().split(/\n{2,}/),nodes=[],i=0;i2?_len-2:0),_key=2;_len>_key;_key++)content[_key-2]=arguments[_key];for(var i=0;i=0;i--){var wrap=this.renderMark(marks[i]);wrap.appendChild(dom),dom=wrap}return dom}},{key:"renderAs",value:function(node,tagName,tagAttrs){return this.renderContent(node,this.elt(tagName,tagAttrs))}}]),DOMSerializer}();(0,_register.defineTarget)("dom",toDOM),(0,_register.defineTarget)("html",toHTML),def(_model.BlockQuote,function(node,s){return s.renderAs(node,"blockquote")}),_model.BlockQuote.prototype.countCoordsAsChild=function(_,path,dom,coords){var childBox=dom.firstChild.getBoundingClientRect();return coords.leftchildBox.left-2)return null;if(childBox.top<=coords.top&&childBox.bottom>=coords.top)return new _model.Pos(path,i)}}},def(_model.ListItem,function(node,s){return s.renderAs(node,"li")}),def(_model.HorizontalRule,function(_,s){return s.elt("hr")}),def(_model.Paragraph,function(node,s){return s.renderAs(node,"p")}),def(_model.Heading,function(node,s){return s.renderAs(node,"h"+node.attrs.level)}),def(_model.CodeBlock,function(node,s){var code=s.renderAs(node,"code");return null!=node.attrs.params&&(code.className="fence "+node.attrs.params.replace(/(^|\s+)/g,"$&lang-")),s.elt("pre",null,code)}),def(_model.Text,function(node,s){return s.doc.createTextNode(node.text)}),def(_model.Image,function(node,s){return s.elt("img",{src:node.attrs.src,alt:node.attrs.alt,title:node.attrs.title})}),def(_model.HardBreak,function(_,s){return s.elt("br")}),def(_model.EmMark,function(_,s){return s.elt("em")}),def(_model.StrongMark,function(_,s){return s.elt("strong")}),def(_model.CodeMark,function(_,s){return s.elt("code")}),def(_model.LinkMark,function(mark,s){return s.elt("a",{href:mark.attrs.href,title:mark.attrs.title})})},{"../model":30,"./register":18}],20:[function(require,module,exports){"use strict";function toText(doc){return doc.type.serializeText(doc).trim()}Object.defineProperty(exports,"__esModule",{value:!0}),exports.toText=toText;var _model=require("../model"),_register=require("./register");_model.Block.prototype.serializeText=function(node){var accum="";return node.forEach(function(child){return accum+=child.type.serializeText(child)}),accum},_model.Textblock.prototype.serializeText=function(node){var text=_model.Block.prototype.serializeText(node);return text&&text+"\n\n"},_model.Inline.prototype.serializeText=function(){return""},_model.HardBreak.prototype.serializeText=function(){return"\n"},_model.Text.prototype.serializeText=function(node){return node.text},(0,_register.defineTarget)("text",toText)},{"../model":30,"./register":18}],21:[function(require,module,exports){"use strict";function defineInputRule(rule){rules[rule.name]=rule}function wrapAndJoin(pm,pos,type){var attrs=arguments.length<=3||void 0===arguments[3]?null:arguments[3],predicate=arguments.length<=4||void 0===arguments[4]?null:arguments[4],before=pos.shorten(),sibling=before.offset>0&&pm.doc.path(before.path).child(before.offset-1),join=sibling&&sibling.type.name==type&&(!predicate||predicate(sibling)),tr=pm.tr.wrap(pos,pos,type,attrs),delPos=tr.map(pos).pos;tr["delete"](new _model.Pos(delPos.path,0),delPos),join&&tr.join(before),tr.apply()}function setAs(pm,pos,type,attrs){pm.tr.setBlockType(pos,pos,type,attrs)["delete"](new _model.Pos(pos.path,0),pos).apply()}Object.defineProperty(exports,"__esModule",{value:!0}),exports.defineInputRule=defineInputRule;var _model=require("../model"),_edit=require("../edit"),_inputrules=require("./inputrules");(0,_edit.defineOption)("autoInput",!1,function(pm,val){if(pm.mod.autoInput&&(pm.mod.autoInput.forEach(function(name){return(0,_inputrules.removeInputRule)(pm,name)}),pm.mod.autoInput=null),val){pm.mod.autoInput=[],pm.schema.registry("autoInput",function(rule,type,name){var rname="schema:"+name+":"+rule.name,handler=rule.handler;pm.isIncluded(rname)&&(handler.bind&&(handler=handler.bind(type)),(0,_inputrules.addInputRule)(pm,new _inputrules.InputRule(rname,rule.match,rule.filter,handler)),pm.mod.autoInput.push(rname))});for(var _name in rules)if(pm.isIncluded(_name)){var rule=rules[_name];(0,_inputrules.addInputRule)(pm,rule),pm.mod.autoInput.push(rule.name)}}});var rules=Object.create(null);defineInputRule(new _inputrules.InputRule("emDash",/--$/,"-","—")),defineInputRule(new _inputrules.InputRule("openDoubleQuote",/\s(")$/,'"',"“")),defineInputRule(new _inputrules.InputRule("closeDoubleQuote",/"$/,'"',"”")),defineInputRule(new _inputrules.InputRule("openSingleQuote",/\s(')$/,"'","‘")),defineInputRule(new _inputrules.InputRule("closeSingleQuote",/'$/,"'","’")),_model.BlockQuote.register("autoInput",new _inputrules.InputRule("startBlockQuote",/^\s*> $/," ",function(pm,_,pos){wrapAndJoin(pm,pos,this)})),_model.OrderedList.register("autoInput",new _inputrules.InputRule("startOrderedList",/^(\d+)\. $/," ",function(pm,match,pos){var order=+match[1];wrapAndJoin(pm,pos,this,{order:order||null},function(node){return node.size+(node.attrs.order||1)==order})})),_model.BulletList.register("autoInput",new _inputrules.InputRule("startBulletList",/^\s*([-+*]) $/," ",function(pm,match,pos){var bullet=match[1];wrapAndJoin(pm,pos,this,null,function(node){return node.attrs.bullet==bullet; +})})),_model.CodeBlock.register("autoInput",new _inputrules.InputRule("startCodeBlock",/^```$/,"`",function(pm,_,pos){setAs(pm,pos,this,{params:""})})),_model.Heading.register("autoInput",new _inputrules.InputRule("startHeading",/^(#{1,6}) $/," ",function(pm,match,pos){setAs(pm,pos,this,{level:match[1].length})}))},{"../edit":9,"../model":30,"./inputrules":22}],22:[function(require,module,exports){"use strict";function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor))throw new TypeError("Cannot call a class as a function")}function addInputRule(pm,rule){pm.mod.interpretInput||(pm.mod.interpretInput=new InputRules(pm)),pm.mod.interpretInput.addRule(rule)}function removeInputRule(pm,name){var ii=pm.mod.interpretInput;ii&&(ii.removeRule(name),0==ii.rules.length&&(ii.unregister(),pm.mod.interpretInput=null))}function getContext(doc,pos){for(var parent=doc.path(pos.path),isCode=parent.type.isCode,textBefore="",i=parent.iter(0,pos.offset),child=void 0;child=i.next().value;)child.isText?textBefore+=child.text:textBefore="",i.atEnd()&&child.marks.some(function(st){return st.type.isCode})&&(isCode=!0);return{textBefore:textBefore,isCode:isCode}}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function defineProperties(target,props){for(var i=0;i1?this.display.enter(rendered,function(){return _this2.leave()},displayInfo):this.display.show(rendered,displayInfo)}},{key:"leave",value:function(){this.stack.pop(),this.stack.length?this.draw():this.display.reset()}},{key:"active",get:function(){return this.stack.length>1}}]),Menu}();exports.Menu=Menu;var TooltipDisplay=function(){function TooltipDisplay(tooltip,resetFunc){_classCallCheck(this,TooltipDisplay),this.tooltip=tooltip,this.resetFunc=resetFunc}return _createClass(TooltipDisplay,[{key:"clear",value:function(){this.tooltip.close()}},{key:"reset",value:function(){this.resetFunc?this.resetFunc():this.clear()}},{key:"show",value:function(dom,info){this.tooltip.open(dom,info)}},{key:"enter",value:function(dom,back,info){var button=(0,_dom.elt)("div",{"class":"ProseMirror-tooltip-back",title:"Back"});button.addEventListener("mousedown",function(e){e.preventDefault(),e.stopPropagation(),back()}),this.show((0,_dom.elt)("div",{"class":"ProseMirror-tooltip-back-wrapper"},dom,button),info)}}]),TooltipDisplay}();exports.TooltipDisplay=TooltipDisplay;var separator={display:function(){return(0,_dom.elt)("div",{"class":"ProseMirror-menuseparator"})}};(0,_edit.defineParamHandler)("default",tooltipParamHandler),(0,_edit.defineParamHandler)("tooltip",tooltipParamHandler),(0,_dom.insertCSS)('\n\n.ProseMirror-menu {\n margin: 0 -4px;\n line-height: 1;\n white-space: pre;\n}\n.ProseMirror-tooltip .ProseMirror-menu {\n width: -webkit-fit-content;\n width: fit-content;\n}\n\n.ProseMirror-tooltip-back-wrapper {\n padding-left: 12px;\n}\n.ProseMirror-tooltip-back {\n position: absolute;\n top: 5px; left: 5px;\n cursor: pointer;\n}\n.ProseMirror-tooltip-back:after {\n content: "«";\n}\n\n.ProseMirror-menuicon {\n margin: 0 7px;\n}\n\n.ProseMirror-menuseparator {\n display: inline-block;\n}\n.ProseMirror-menuseparator:after {\n content: "︙";\n opacity: 0.5;\n padding: 0 4px;\n}\n\n.ProseMirror-select, .ProseMirror-select-menu {\n border: 1px solid #777;\n border-radius: 3px;\n font-size: 90%;\n}\n\n.ProseMirror-select {\n padding: 1px 12px 1px 4px;\n display: inline-block;\n vertical-align: 1px;\n position: relative;\n cursor: pointer;\n margin: 0 8px;\n}\n\n.ProseMirror-select-command-textblockType {\n min-width: 3.2em;\n}\n\n.ProseMirror-select:after {\n content: "▿";\n color: #777;\n position: absolute;\n right: 4px;\n}\n\n.ProseMirror-select-menu {\n position: absolute;\n background: #444;\n color: white;\n padding: 2px 2px;\n z-index: 15;\n}\n.ProseMirror-select-menu div {\n cursor: pointer;\n padding: 0 1em 0 2px;\n}\n.ProseMirror-select-menu div:hover {\n background: #777;\n}\n\n')},{"../dom":1,"../edit":9,"../ui/tooltip":45,"../util/sortedinsert":50,"./icons":23}],25:[function(require,module,exports){"use strict";function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor))throw new TypeError("Cannot call a class as a function")}function getItems(pm,items){return Array.isArray(items)?items.map(getItems.bind(null,pm)):pm.commands[items]}function findWrappingScrollable(node){for(var cur=node.parentNode;cur;cur=cur.parentNode)if(cur.scrollHeight>cur.clientHeight)return cur}var _createClass=function(){function defineProperties(target,props){for(var i=0;i=0||editorRect.bottomwindow.innerHeight?"none":""}else if(editorRect.top<0&&editorRect.bottom>=this.menuElt.offsetHeight+10){this.floating=!0;var menuRect=this.menuElt.getBoundingClientRect();this.menuElt.style.left=menuRect.left+"px",this.menuElt.style.width=menuRect.width+"px",this.menuElt.style.position="fixed"}}},{key:"prepareScrollCursor",value:function(){var _this3=this;if(!this.floating)return null;var head=this.pm.selection.head;if(!head)return null;var cursorPos=this.pm.coordsAtPos(head),menuRect=this.menuElt.getBoundingClientRect();if(cursorPos.topmenuRect.top){var _ret=function(){var scrollable=findWrappingScrollable(_this3.pm.wrapper);return scrollable?{v:function(){return scrollable.scrollTop-=menuRect.bottom-cursorPos.top}}:void 0}();if("object"==typeof _ret)return _ret.v}}}]),MenuBar}();(0,_dom.insertCSS)("\n."+prefix+" {\n position: relative;\n margin-bottom: 3px;\n border-top-left-radius: inherit;\n border-top-right-radius: inherit;\n}\n\n."+prefix+"-inner {\n min-height: 1em;\n color: #666;\n padding: 1px 6px;\n top: 0; left: 0; right: 0;\n position: absolute;\n border-bottom: 1px solid silver;\n background: white;\n z-index: 10;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n overflow: hidden;\n border-top-left-radius: inherit;\n border-top-right-radius: inherit;\n}\n\n."+prefix+" .ProseMirror-icon-active {\n background: #eee;\n}\n\n."+prefix+' input[type="text"],\n.'+prefix+" textarea {\n background: #eee;\n color: black;\n border: none;\n outline: none;\n width: 100%;\n box-sizing: -moz-border-box;\n box-sizing: border-box;\n}\n\n."+prefix+' input[type="text"] {\n padding: 0 4px;\n}\n\n.'+prefix+" form {\n position: relative;\n padding: 2px 4px;\n}\n\n."+prefix+" .ProseMirror-blocktype {\n border: 1px solid #ccc;\n min-width: 4em;\n}\n."+prefix+" .ProseMirror-blocktype:after {\n color: #ccc;\n}\n\n."+prefix+"-sliding {\n -webkit-transition: left 0.2s ease-out;\n -moz-transition: left 0.2s ease-out;\n transition: left 0.2s ease-out;\n position: relative;\n left: 100%;\n width: 100%;\n box-sizing: -moz-border-box;\n box-sizing: border-box;\n padding-left: 16px;\n background: white;\n}\n\n."+prefix+"-back {\n position: absolute;\n height: 100%;\n margin-top: -1px;\n padding-bottom: 2px;\n width: 10px;\n left: 0;\n border-right: 1px solid silver;\n cursor: pointer;\n}\n."+prefix+'-back:after {\n content: "«";\n}\n\n')},{"../dom":1,"../edit":9,"../ui/update":46,"./menu":24}],26:[function(require,module,exports){"use strict";function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor))throw new TypeError("Cannot call a class as a function")}function getItems(pm,items){return Array.isArray(items)?items.map(getItems.bind(null,pm)):pm.commands[items]}function topCenterOfSelection(){for(var rects=window.getSelection().getRangeAt(0).getClientRects(),_rects$0=rects[0],left=_rects$0.left,right=_rects$0.right,top=_rects$0.top,i=1;left==right&&rects.length>i;){var _rects=rects[i++];left=_rects.left,right=_rects.right,top=_rects.top}for(;i1)&&(left=Math.min(left,rects[i].left),right=Math.max(right,rects[i].right),top=Math.min(top,rects[i].top));return{top:top,left:(left+right)/2}}function topOfNodeSelection(pm){var selected=pm.content.querySelector(".ProseMirror-selectednode");if(!selected)return{left:0,top:0};var box=selected.getBoundingClientRect();return{left:Math.min((box.left+box.right)/2,box.left+20),top:box.top}}var _createClass=function(){function defineProperties(target,props){for(var i=0;isame&&childA.text[childA.text.length-same-1]==childB.text[childB.text.length-same-1];)same++,offA--,offB--;break}if(offA-=childA.width,offB-=childB.width,childA.size||childB.size){pathA.push(offA),pathB.push(offB);var inner=findDiffEnd(childA.content,childB.content,pathA,pathB);if(inner)return inner;pathA.pop(),pathB.pop()}}else offA-=childA.width,offB-=childB.width}return{a:new _pos.Pos(pathA,offA),b:new _pos.Pos(pathB,offB)}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.findDiffStart=findDiffStart,exports.findDiffEnd=findDiffEnd;var _pos=require("./pos")},{"./pos":33}],29:[function(require,module,exports){"use strict";function _inherits(subClass,superClass){if("function"!=typeof superClass&&null!==superClass)throw new TypeError("Super expression must either be null or a function, not "+typeof superClass);subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,enumerable:!1,writable:!0,configurable:!0}}),superClass&&(Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__=superClass)}function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(exports,"__esModule",{value:!0});var _get=function(_x16,_x17,_x18){for(var _again=!0;_again;){var object=_x16,property=_x17,receiver=_x18;_again=!1,null===object&&(object=Function.prototype);var desc=Object.getOwnPropertyDescriptor(object,property);if(void 0!==desc){if("value"in desc)return desc.value;var getter=desc.get;if(void 0===getter)return;return getter.call(receiver)}var parent=Object.getPrototypeOf(object);if(null===parent)return;_x16=parent,_x17=property,_x18=receiver,_again=!0,desc=parent=void 0}},_createClass=function(){function defineProperties(target,props){for(var i=0;ipath.length,moreTo=to&&to.depth>path.length,start=moreFrom?from.path[path.length]:from?from.offset:0,end=moreTo?to.path[path.length]+1:to?to.offset:this.size,iter=this.iter(start,end),node=void 0;node=iter.next().value;){var startOffset=iter.offset-node.width;path.push(startOffset),node.nodesBetween(moreFrom&&startOffset==start?from:null,moreTo&&iter.offset==end?to:null,f,path,parent),path.pop()}}},{key:"sliceBetween",value:function(from,to){for(var depth=arguments.length<=2||void 0===arguments[2]?0:arguments[2],moreFrom=from&&from.depth>depth,moreTo=to&&to.depth>depth,start=moreFrom?from.path[depth]:from?from.offset:0,end=moreTo?to.path[depth]+1:to?to.offset:this.size,nodes=[],iter=this.iter(start,end),node=void 0;node=iter.next().value;){var passFrom=moreFrom&&iter.offset-node.width==start?from:null,passTo=moreTo&&iter.offset==end?to:null;(passFrom||passTo)&&(node=node.sliceBetween(passFrom,passTo,depth+1)),nodes.push(node)}return new this.constructor(nodes)}},{key:"textContent",get:function(){var text="";return this.forEach(function(n){return text+=n.textContent}),text}}],[{key:"fromJSON",value:function(schema,value){return value?this.fromArray(value.map(schema.nodeFromJSON)):emptyFragment}},{key:"fromArray",value:function(array){if(!array.length)return emptyFragment;for(var hasText=!1,joined=void 0,i=0;ioff||off>=this.content.length)throw new Error("Offset "+off+" out of range");return this.content[off]}},{key:"forEach",value:function(f){for(var i=0;i0&&joinRight>0&&before.sameMarkup(after)?content.push(before.append(after.content,joinLeft-1,joinRight-1)):content.push(before.close(joinLeft-1,"end"),after.close(joinRight-1,"start")),Fragment.fromArray(content.concat(other.toArray(after.width)))}},{key:"toJSON",value:function(){return this.content.map(function(n){return n.toJSON()})}},{key:"size",get:function(){return this.content.length}},{key:"firstChild",get:function(){return this.content.length?this.content[0]:null}},{key:"lastChild",get:function(){return this.content.length?this.content[this.content.length-1]:null}}]),FlatFragment}(Fragment),emptyFragment=new FlatFragment([]);exports.emptyFragment=emptyFragment;var TextIterator=function(){function TextIterator(fragment,startOffset,endOffset){var pos=arguments.length<=3||void 0===arguments[3]?-1:arguments[3];_classCallCheck(this,TextIterator),this.frag=fragment,this.offset=startOffset,this.pos=pos,this.endOffset=endOffset}return _createClass(TextIterator,[{key:"copy",value:function(){return new this.constructor(this.frag,this.offset,this.endOffset,this.pos)}},{key:"atEnd",value:function(){return this.offset==this.endOffset}},{key:"next",value:function(){if(-1==this.pos){var start=this.init();if(start)return start}return this.offset==this.endOffset?iterEnd:this.advance()}},{key:"advance",value:function(){var node=this.frag.content[this.pos++],end=this.offset+node.width;return end>this.endOffset?(node=node.copy(node.text.slice(0,this.endOffset-this.offset)),this.offset=this.endOffset,node):(this.offset=end,node)}},{key:"init",value:function(){this.pos=0;for(var offset=0;offsetthis.offset){var sliceEnd=node.width;return end>this.endOffset&&(sliceEnd=this.endOffset-offset,end=this.endOffset),node=node.copy(node.text.slice(this.offset-offset,sliceEnd)),this.offset=end,node}offset=end}}}]),TextIterator}(),ReverseTextIterator=function(_TextIterator){function ReverseTextIterator(){_classCallCheck(this,ReverseTextIterator),_get(Object.getPrototypeOf(ReverseTextIterator.prototype),"constructor",this).apply(this,arguments)}return _inherits(ReverseTextIterator,_TextIterator),_createClass(ReverseTextIterator,[{key:"advance",value:function(){var node=this.frag.content[--this.pos],end=this.offset-node.width;return endthis.offset;){var node=this.frag.content[--this.pos],end=offset-node.width;if(end==this.offset)break;if(endoff||off>=this.size)throw new Error("Offset "+off+" out of range");for(var i=0,curOff=0;ioff)return child}}},{key:"forEach",value:function(f){for(var i=0,off=0;i=off)return{node:child,start:curOff};curOff=end}}},{key:"chunkAfter",value:function(off){if(off==this.size)throw new Error("No chunk after end of node");for(var i=0,curOff=0;ioff)return{node:child,start:curOff};curOff=end}}},{key:"slice",value:function(){var from=arguments.length<=0||void 0===arguments[0]?0:arguments[0],to=arguments.length<=1||void 0===arguments[1]?this.size:arguments[1];return from==to?emptyFragment:new TextFragment(this.toArray(from,to))}},{key:"replace",value:function(off,node){if(node.isText)throw new Error("Argument to replace should be a non-text node");for(var curNode=void 0,index=void 0,curOff=0;off>curOff;index++)curNode=this.content[index],curOff+=curNode.width;if(curNode.isText)throw new Error("Can not replace text content with replace method");var copy=this.content.slice();return copy[index]=node,new TextFragment(copy)}},{key:"appendInner",value:function(other,joinLeft,joinRight){var last=this.content.length-1,content=this.content.slice(0,last),before=this.content[last],after=other.firstChild,same=before.sameMarkup(after);return same&&before.isText?content.push(before.copy(before.text+after.text)):same&&joinLeft>0&&joinRight>0?content.push(before.append(after.content,joinLeft-1,joinRight-1)):content.push(before.close(joinLeft-1,"end"),after.close(joinRight-1,"start")),Fragment.fromArray(content.concat(other.toArray(after.width)))}},{key:"toJSON",value:function(){return this.content.map(function(n){return n.toJSON()})}},{key:"firstChild",get:function(){return this.size?this.content[0]:null}},{key:"lastChild",get:function(){return this.size?this.content[this.content.length-1]:null}}]),TextFragment}(Fragment);"undefined"!=typeof Symbol&&(Fragment.prototype[Symbol.iterator]=function(){return this.iter()},FlatIterator.prototype[Symbol.iterator]=TextIterator.prototype[Symbol.iterator]=function(){return this})},{}],30:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var _node=require("./node");Object.defineProperty(exports,"Node",{enumerable:!0,get:function(){return _node.Node}});var _fragment=require("./fragment");Object.defineProperty(exports,"Fragment",{enumerable:!0,get:function(){return _fragment.Fragment}}),Object.defineProperty(exports,"emptyFragment",{enumerable:!0,get:function(){return _fragment.emptyFragment}});var _mark=require("./mark");Object.defineProperty(exports,"Mark",{enumerable:!0,get:function(){return _mark.Mark}});var _schema=require("./schema");Object.defineProperty(exports,"SchemaSpec",{enumerable:!0,get:function(){return _schema.SchemaSpec}}),Object.defineProperty(exports,"Schema",{enumerable:!0,get:function(){return _schema.Schema}}),Object.defineProperty(exports,"SchemaError",{enumerable:!0,get:function(){return _schema.SchemaError}}),Object.defineProperty(exports,"NodeType",{enumerable:!0,get:function(){return _schema.NodeType}}),Object.defineProperty(exports,"Block",{enumerable:!0,get:function(){return _schema.Block}}),Object.defineProperty(exports,"Textblock",{enumerable:!0,get:function(){return _schema.Textblock}}),Object.defineProperty(exports,"Inline",{enumerable:!0,get:function(){return _schema.Inline}}),Object.defineProperty(exports,"Text",{enumerable:!0,get:function(){return _schema.Text}}),Object.defineProperty(exports,"MarkType",{enumerable:!0,get:function(){return _schema.MarkType}}),Object.defineProperty(exports,"Attribute",{enumerable:!0,get:function(){return _schema.Attribute}});var _defaultschema=require("./defaultschema");Object.defineProperty(exports,"defaultSchema",{enumerable:!0,get:function(){return _defaultschema.defaultSchema}}),Object.defineProperty(exports,"Doc",{enumerable:!0,get:function(){return _defaultschema.Doc}}),Object.defineProperty(exports,"BlockQuote",{enumerable:!0,get:function(){return _defaultschema.BlockQuote}}),Object.defineProperty(exports,"OrderedList",{enumerable:!0,get:function(){return _defaultschema.OrderedList}}),Object.defineProperty(exports,"BulletList",{enumerable:!0,get:function(){return _defaultschema.BulletList}}),Object.defineProperty(exports,"ListItem",{enumerable:!0,get:function(){return _defaultschema.ListItem}}),Object.defineProperty(exports,"HorizontalRule",{enumerable:!0,get:function(){return _defaultschema.HorizontalRule}}),Object.defineProperty(exports,"Paragraph",{enumerable:!0,get:function(){return _defaultschema.Paragraph}}),Object.defineProperty(exports,"Heading",{enumerable:!0,get:function(){return _defaultschema.Heading}}),Object.defineProperty(exports,"CodeBlock",{enumerable:!0,get:function(){return _defaultschema.CodeBlock}}),Object.defineProperty(exports,"Image",{enumerable:!0,get:function(){return _defaultschema.Image}}),Object.defineProperty(exports,"HardBreak",{enumerable:!0,get:function(){return _defaultschema.HardBreak}}),Object.defineProperty(exports,"CodeMark",{enumerable:!0,get:function(){return _defaultschema.CodeMark}}),Object.defineProperty(exports,"EmMark",{enumerable:!0,get:function(){return _defaultschema.EmMark}}),Object.defineProperty(exports,"StrongMark",{enumerable:!0,get:function(){return _defaultschema.StrongMark}}),Object.defineProperty(exports,"LinkMark",{enumerable:!0,get:function(){return _defaultschema.LinkMark}});var _pos=require("./pos");Object.defineProperty(exports,"Pos",{enumerable:!0,get:function(){return _pos.Pos}});var _diff=require("./diff");Object.defineProperty(exports,"findDiffStart",{enumerable:!0,get:function(){return _diff.findDiffStart}}),Object.defineProperty(exports,"findDiffEnd",{enumerable:!0,get:function(){return _diff.findDiffEnd}})},{"./defaultschema":27,"./diff":28,"./fragment":29,"./mark":31,"./node":32,"./pos":33,"./schema":34}],31:[function(require,module,exports){"use strict";function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function defineProperties(target,props){for(var i=0;ithis.type.rank)return set.slice(0,i).concat(this).concat(set.slice(i))}return set.concat(this)}},{key:"removeFromSet",value:function(set){for(var i=0;i=0;i--)str=marks[i].type.name+"("+str+")";return str}Object.defineProperty(exports,"__esModule",{value:!0});var _get=function(_x8,_x9,_x10){for(var _again=!0;_again;){var object=_x8,property=_x9,receiver=_x10;_again=!1,null===object&&(object=Function.prototype);var desc=Object.getOwnPropertyDescriptor(object,property);if(void 0!==desc){if("value"in desc)return desc.value;var getter=desc.get;if(void 0===getter)return;return getter.call(receiver)}var parent=Object.getPrototypeOf(object);if(null===parent)return;_x8=parent,_x9=property,_x10=receiver,_again=!0,desc=parent=void 0}},_createClass=function(){function defineProperties(target,props){for(var i=0;i0&&(closedContent=this.content.close(depth-1,side))!=this.content?this.copy(closedContent):this}},{key:"path",value:function(_path){for(var i=0,node=this;i<_path.length;node=node.child(_path[i]),i++);return node}},{key:"nodeAfter",value:function(pos){return this.path(pos.path).child(pos.offset)}},{key:"pathNodes",value:function(path){for(var nodes=[],i=0,node=this;nodes.push(node),i!=path.length;i++)node=node.child(path[i]);return nodes}},{key:"isValidPos",value:function(pos,requireTextblock){for(var i=0,node=this;;i++){if(i==pos.path.length)return requireTextblock&&!node.isTextblock?!1:pos.offset<=node.size;var n=pos.path[i];if(n>=node.size)return!1;node=node.child(n)}}},{key:"siblingRange",value:function(from,to){for(var i=0,node=this;;i++){if(node.isTextblock){var path=from.path.slice(0,i-1),offset=from.path[i-1];return{from:new _pos.Pos(path,offset),to:new _pos.Pos(path,offset+1)}}var fromEnd=i==from.path.length,toEnd=i==to.path.length,left=fromEnd?from.offset:from.path[i],right=toEnd?to.offset:to.path[i];if(fromEnd||toEnd||left!=right){var path=from.path.slice(0,i);return{from:new _pos.Pos(path,left),to:new _pos.Pos(path,right+(toEnd?0:1))}}node=node.child(left)}}},{key:"nodesBetween",value:function(from,to,f){var path=arguments.length<=3||void 0===arguments[3]?[]:arguments[3],parent=arguments.length<=4||void 0===arguments[4]?null:arguments[4];f(this,path,parent)!==!1&&this.content.nodesBetween(from,to,f,path,this)}},{key:"inlineNodesBetween",value:function(from,to,f){this.nodesBetween(from,to,function(node,path,parent){if(node.isInline){var last=path.length-1;f(node,path.slice(0,last),path[last],path[last]+node.width,parent)}})}},{key:"sliceBetween",value:function(from,to){var depth=arguments.length<=2||void 0===arguments[2]?0:arguments[2];return this.copy(this.content.sliceBetween(from,to,depth))}},{key:"marksAt",value:function(pos){var parent=this.path(pos.path);return parent.isTextblock&&parent.size?parent.chunkBefore(pos.offset||1).node.marks:emptyArray}},{key:"rangeHasMark",value:function(from,to,type){var found=!1;return this.nodesBetween(from,to,function(node){type.isInSet(node.marks)&&(found=!0)}),found}},{key:"toString",value:function(){var name=this.type.name;return this.content.size&&(name+="("+this.content.toString()+")"),wrapMarks(this.marks,name)}},{key:"toJSON",value:function(){var obj={type:this.type.name};for(var _ in this.attrs){obj.attrs=this.attrs;break}return this.size&&(obj.content=this.content.toJSON()),this.marks.length&&(obj.marks=this.marks.map(function(n){return n.toJSON()})),obj}},{key:"size",get:function(){return this.content.size}},{key:"width",get:function(){return 1}},{key:"textContent",get:function(){return this.content.textContent}},{key:"firstChild",get:function(){return this.content.firstChild}},{key:"lastChild",get:function(){return this.content.lastChild}},{key:"isBlock",get:function(){return this.type.isBlock}},{key:"isTextblock",get:function(){return this.type.isTextblock; +}},{key:"isInline",get:function(){return this.type.isInline}},{key:"isText",get:function(){return this.type.isText}},{key:"value",get:function(){return this}}],[{key:"sameAttrs",value:function(a,b){if(a==b)return!0;for(var prop in a)if(a[prop]!==b[prop])return!1;return!0}},{key:"fromJSON",value:function(schema,json){var type=schema.nodeType(json.type),content=null!=json.text?json.text:_fragment.Fragment.fromJSON(schema,json.content);return type.create(json.attrs,content,json.marks&&json.marks.map(schema.markFromJSON))}}]),Node}();exports.Node=Node,"undefined"!=typeof Symbol&&(Node.prototype[Symbol.iterator]=function(){return this.iter()});var TextNode=function(_Node){function TextNode(type,attrs,content,marks){_classCallCheck(this,TextNode),_get(Object.getPrototypeOf(TextNode.prototype),"constructor",this).call(this,type,attrs,null,marks),this.text=content}return _inherits(TextNode,_Node),_createClass(TextNode,[{key:"toString",value:function(){return wrapMarks(this.marks,JSON.stringify(this.text))}},{key:"mark",value:function(marks){return new TextNode(this.type,this.attrs,this.text,marks)}},{key:"toJSON",value:function(){var base=_get(Object.getPrototypeOf(TextNode.prototype),"toJSON",this).call(this);return base.text=this.text,base}},{key:"textContent",get:function(){return this.text}},{key:"width",get:function(){return this.text.length}}]),TextNode}(Node);exports.TextNode=TextNode},{"./fragment":29,"./mark":31,"./pos":33}],33:[function(require,module,exports){"use strict";function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function defineProperties(target,props){for(var i=0;i0?this:other}},{key:"mmin",value:function(other){return this.cmp(other)<0?this:other}},{key:"cmp",value:function(other){return other==this?0:Pos.cmp(this.path,this.offset,other.path,other.offset)}},{key:"shorten",value:function(){var to=arguments.length<=0||void 0===arguments[0]?null:arguments[0],offset=arguments.length<=1||void 0===arguments[1]?0:arguments[1];return to>=this.depth?this:Pos.shorten(this.path,to,offset)}},{key:"move",value:function(by){return new Pos(this.path,this.offset+by)}},{key:"toPath",value:function(){var move=arguments.length<=0||void 0===arguments[0]?0:arguments[0];return this.path.concat(this.offset+move)}},{key:"extend",value:function(pos){for(var path=this.path.slice(),add=this.offset,i=0;ii;i++){var diff=pathA[i]-pathB[i];if(0!=diff)return diff}return lenA>lenB?offsetB<=pathA[i]?1:-1:lenB>lenA?offsetA<=pathB[i]?-1:1:offsetA-offsetB}},{key:"samePath",value:function(pathA,pathB){if(pathA.length!=pathB.length)return!1;for(var i=0;i=0;i--)inner=conn[i].create(null,inner);return _fragment.Fragment.from(inner)}},{key:"contains",get:function(){return"block"}},{key:"isBlock",get:function(){return!0}},{key:"canBeEmpty",get:function(){return null==this.contains}}],[{key:"kinds",get:function(){return"block"}}]),Block}(NodeType);exports.Block=Block;var Textblock=function(_Block){function Textblock(){_classCallCheck(this,Textblock),_get(Object.getPrototypeOf(Textblock.prototype),"constructor",this).apply(this,arguments)}return _inherits(Textblock,_Block),_createClass(Textblock,[{key:"contains",get:function(){return"inline"}},{key:"containsMarks",get:function(){return!0}},{key:"isTextblock",get:function(){return!0}},{key:"canBeEmpty",get:function(){return!0}}]),Textblock}(Block);exports.Textblock=Textblock;var Inline=function(_NodeType2){function Inline(){_classCallCheck(this,Inline),_get(Object.getPrototypeOf(Inline.prototype),"constructor",this).apply(this,arguments)}return _inherits(Inline,_NodeType2),_createClass(Inline,[{key:"isInline",get:function(){return!0}}],[{key:"kinds",get:function(){return"inline"}}]),Inline}(NodeType);exports.Inline=Inline;var Text=function(_Inline){function Text(){_classCallCheck(this,Text),_get(Object.getPrototypeOf(Text.prototype),"constructor",this).apply(this,arguments)}return _inherits(Text,_Inline),_createClass(Text,[{key:"create",value:function(attrs,content,marks){return new _node.TextNode(this,this.computeAttrs(attrs,content),content,marks)}},{key:"selectable",get:function(){return!1}},{key:"isText",get:function(){return!0}}],[{key:"kinds",get:function(){return _get(Object.getPrototypeOf(Text),"kinds",this)+" text"}}]),Text}(Inline);exports.Text=Text;var Attribute=function Attribute(){var options=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];_classCallCheck(this,Attribute),this["default"]=options["default"],this.compute=options.compute};exports.Attribute=Attribute;var MarkType=function(_SchemaItem2){function MarkType(name,rank,schema){_classCallCheck(this,MarkType),_get(Object.getPrototypeOf(MarkType.prototype),"constructor",this).call(this),this.name=name,this.freezeAttrs(),this.rank=rank,this.schema=schema;var defaults=this.getDefaultAttrs();this.instance=defaults&&new _mark.Mark(this,defaults)}return _inherits(MarkType,_SchemaItem2),_createClass(MarkType,[{key:"create",value:function(attrs){return!attrs&&this.instance?this.instance:new _mark.Mark(this,this.computeAttrs(attrs))}},{key:"removeFromSet",value:function(set){for(var i=0;ii;i++){var obj=i?this.marks:this.nodes;for(var tname in obj){var type=obj[tname];if(type.constructor.prototype.hasOwnProperty("registry")){var reg=type.registry[name];if(reg)for(var j=0;j-1)return{path:range.from.path.slice(0,parentDepth),unwrap:unwrap};if(unwrap||!content[0].isBlock)return null;content=content[0].content.slice(range.from.offset,range.to.offset),unwrap=!0}}function canLift(doc,from,to){var range=doc.siblingRange(from,to||from),found=canBeLifted(doc,range);return found?{found:found,range:range}:void 0}function canWrap(doc,from,to,type){var range=doc.siblingRange(from,to||from);if(range.from.offset==range.to.offset)return null;var parent=doc.path(range.from.path),around=parent.type.findConnection(type),inside=type.findConnection(parent.child(range.from.offset).type);return around&&inside?{range:range,around:around,inside:inside}:void 0}Object.defineProperty(exports,"__esModule",{value:!0}),exports.canLift=canLift,exports.canWrap=canWrap;var _model=require("../model"),_transform=require("./transform"),_step=require("./step"),_tree=require("./tree"),_map=require("./map");_step.Step.define("ancestor",{apply:function(doc,step){var from=step.from,to=step.to;if(!(0,_tree.isFlatRange)(from,to))return null;for(var toParent=from.path,start=from.offset,end=to.offset,_step$param=step.param,_step$param$depth=_step$param.depth,depth=void 0===_step$param$depth?0:_step$param$depth,_step$param$types=_step$param.types,types=void 0===_step$param$types?[]:_step$param$types,_step$param$attrs=_step$param.attrs,attrs=void 0===_step$param$attrs?[]:_step$param$attrs,inner=doc.path(from.path),i=0;depth>i;i++){if(start>0||end=0;i--)node=types[i].create(attrs[i],node||content);newParent=parent.splice(start,end,_model.Fragment.from(node))}();if("object"==typeof _ret)return _ret.v}else{if(!parent.type.canContainFragment(inner.content)||!inner.size&&0==start&&end==parent.size&&!parent.type.canBeEmpty)return null;newParent=parent.splice(start,end,inner.content)}for(var copy=doc.replaceDeep(toParent,newParent),toInner=toParent.slice(),i=0;i1||types.length>1){var posBefore=new _model.Pos(toParent,start),posAfter1=new _model.Pos(toParent,end),posAfter2=new _model.Pos(toParent,start+insertedSize),endOfInner=new _model.Pos(toInner,startOfInner.offset+(to.offset-from.offset));replaced=[new _map.ReplacedRange(posBefore,from,posBefore,startOfInner),new _map.ReplacedRange(to,posAfter1,endOfInner,posAfter2,posAfter1,posAfter2)]}var moved=[new _map.MovedRange(from,to.offset-from.offset,startOfInner)];return end-start!=insertedSize&&moved.push(new _map.MovedRange(new _model.Pos(toParent,end),parentSize-end,new _model.Pos(toParent,start+insertedSize))),new _step.StepResult(copy,new _map.PosMap(moved,replaced))},invert:function(step,oldDoc,map){var types=[],attrs=[];if(step.param.depth)for(var i=0;i0){this.split(pos,depth-d);for(var cut=range.from.path.length-depth,path=pos.path.slice(0,cut).concat(pos.path[cut]+1);path.lengthrange.from.offset;i--)this.join(new _model.Pos(range.from.path,i));for(var size=0,i=rangeNode.iter(range.from.offset,range.to.offset),child=void 0;child=i.next().value;)size+=child.size;var path=range.from.path.concat(range.from.offset);range={from:new _model.Pos(path,0),to:new _model.Pos(path,size)},++depth}return this.step("ancestor",range.from,range.to,null,{depth:depth}),this}.apply(this,arguments)},_transform.Transform.prototype.wrap=function(from,to,type,wrapAttrs){var can=canWrap(this.doc,from,to,type);if(!can)return this;var range=can.range,around=can.around,inside=can.inside,types=around.concat(type).concat(inside),attrs=around.map(function(){return null}).concat(wrapAttrs).concat(inside.map(function(){return null}));if(this.step("ancestor",range.from,range.to,null,{types:types,attrs:attrs}),inside.length){for(var toInner=range.from.path.slice(),i=0;i0;i--)this.split(new _model.Pos(toInner,i),inside.length)}return this},_transform.Transform.prototype.setBlockType=function(from,to,type,attrs){var _this=this;return this.doc.nodesBetween(from,to||from,function(node,path){return node.isTextblock&&!node.hasMarkup(type,attrs)?(path=path.slice(),_this.clearMarkup(new _model.Pos(path,0),new _model.Pos(path,node.size),type),_this.step("ancestor",new _model.Pos(path,0),new _model.Pos(path,_this.doc.path(path).size),null,{depth:1,types:[type],attrs:[attrs]}),!1):void 0}),this},_transform.Transform.prototype.setNodeType=function(pos,type,attrs){var node=this.doc.nodeAfter(pos),path=pos.toPath();return this.step("ancestor",new _model.Pos(path,0),new _model.Pos(path,node.size),null,{depth:1,types:[type],attrs:[attrs]}),this}},{"../model":30,"./map":38,"./step":42,"./transform":43,"./tree":44}],36:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),require("./mark"),require("./split"),require("./replace");var _transform=require("./transform");Object.defineProperty(exports,"Transform",{enumerable:!0,get:function(){return _transform.Transform}});var _step=require("./step");Object.defineProperty(exports,"Step",{enumerable:!0,get:function(){return _step.Step}}),Object.defineProperty(exports,"StepResult",{enumerable:!0,get:function(){return _step.StepResult}});var _ancestor=require("./ancestor");Object.defineProperty(exports,"canLift",{enumerable:!0,get:function(){return _ancestor.canLift}}),Object.defineProperty(exports,"canWrap",{enumerable:!0,get:function(){return _ancestor.canWrap}});var _join=require("./join");Object.defineProperty(exports,"joinPoint",{enumerable:!0,get:function(){return _join.joinPoint}}),Object.defineProperty(exports,"joinableBlocks",{enumerable:!0,get:function(){return _join.joinableBlocks}});var _map=require("./map");Object.defineProperty(exports,"PosMap",{enumerable:!0,get:function(){return _map.PosMap}}),Object.defineProperty(exports,"MapResult",{enumerable:!0,get:function(){return _map.MapResult}}),Object.defineProperty(exports,"Remapping",{enumerable:!0,get:function(){return _map.Remapping}})},{"./ancestor":35,"./join":37,"./map":38,"./mark":39,"./replace":40,"./split":41,"./step":42,"./transform":43}],37:[function(require,module,exports){"use strict";function joinableBlocks(doc,pos){if(0==pos.offset)return!1;var parent=doc.path(pos.path);if(parent.isTextblock||pos.offset==parent.size)return!1;var type=parent.child(pos.offset-1).type;return!type.isTextblock&&type.contains&&type==parent.child(pos.offset).type}function joinPoint(doc,pos){for(var dir=arguments.length<=2||void 0===arguments[2]?-1:arguments[2];;){if(joinableBlocks(doc,pos))return pos;if(0==pos.depth)return null;pos=pos.shorten(null,0>dir?0:1)}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.joinableBlocks=joinableBlocks,exports.joinPoint=joinPoint;var _model=require("../model"),_transform=require("./transform"),_step=require("./step"),_map=require("./map");_step.Step.define("join",{apply:function(doc,step){var before=doc.path(step.from.path),after=doc.path(step.to.path);if(step.from.offset0||!before.type.canContainFragment(after.content))return null;var pFrom=step.from.path,pTo=step.to.path,last=pFrom.length-1,offset=pFrom[last]+1;if(pFrom.length!=pTo.length||0==pFrom.length||offset!=pTo[last])return null;for(var i=0;last>i;i++)if(pFrom[i]!=pTo[i])return null;var targetPath=pFrom.slice(0,last),target=doc.path(targetPath),oldSize=target.size;if(target.type.locked)return null;var joined=before.append(after.content),copy=doc.replaceDeep(targetPath,target.splice(offset-1,offset+1,_model.Fragment.from(joined))),map=new _map.PosMap([new _map.MovedRange(step.to,after.size,step.from),new _map.MovedRange(new _model.Pos(targetPath,offset+1),oldSize-offset-1,new _model.Pos(targetPath,offset))],[new _map.ReplacedRange(step.from,step.to,step.from,step.from,step.to.shorten())]);return new _step.StepResult(copy,map)},invert:function(step,oldDoc){return new _step.Step("split",null,null,step.from,oldDoc.path(step.to.path).copy())}}),_transform.Transform.prototype.join=function(at){var parent=this.doc.path(at.path);return 0==at.offset||at.offset==parent.size||parent.isTextblock?this:(this.step("join",new _model.Pos(at.path.concat(at.offset-1),parent.child(at.offset-1).size),new _model.Pos(at.path.concat(at.offset),0)),this)}},{"../model":30,"./map":38,"./step":42,"./transform":43}],38:[function(require,module,exports){"use strict";function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor))throw new TypeError("Cannot call a class as a function")}function offsetFrom(base,pos){if(pos.path.length>base.path.length){for(var path=[pos.path[base.path.length]-base.offset],i=base.path.length+1;i=0&&(right=pos.cmp(side.to))<=0){var other=back?range.before:range.after;return new MapResult(0>bias?other.from:other.to,!(!left||!right),{rangeID:i,offset:offsetFrom(side.ref,pos)})}}for(var i=0;i=0&&_model.Pos.cmp(pos.path,pos.offset,start.path,start.offset+range.size)<=0){var dest=back?range.start:range.dest,depth=start.depth;if(pos.depth>depth){var offset=dest.offset+(pos.path[depth]-start.offset);return new MapResult(new _model.Pos(dest.path.concat(offset).concat(pos.path.slice(depth+1)),pos.offset))}return new MapResult(new _model.Pos(dest.path,dest.offset+(pos.offset-start.offset)))}}return new MapResult(pos)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function defineProperties(target,props){for(var i=0;iid?this.head[-id-1]:this.tail[id]}},{key:"map",value:function map(pos,bias){for(var deleted=!1,i=-this.head.length;i=0;i--)this.step(delSteps[i]);return this}},{"../model":30,"./step":42,"./transform":43,"./tree":44}],40:[function(require,module,exports){"use strict";function findMovedChunks(oldNode,oldPath,newNode,startDepth){for(var moved=[],newPath=oldPath.path.slice(0,startDepth),depth=startDepth;;depth++){var joined=depth==oldPath.depth?0:1,cut=depth==oldPath.depth?oldPath.offset:oldPath.path[depth],afterCut=oldNode.size-cut,newOffset=newNode.size-afterCut,from=oldPath.shorten(depth,joined),to=new _model.Pos(newPath,newOffset+joined);if(from.cmp(to)&&moved.push(new _map.MovedRange(from,afterCut-joined,to)),!joined)return moved;oldNode=oldNode.child(cut),newNode=newNode.child(newOffset),newPath=newPath.concat(newOffset)}}function replace(node,from,to,root,repl){var depth=arguments.length<=5||void 0===arguments[5]?0:arguments[5];if(depth==root.length){var before=node.sliceBetween(null,from,depth),after=node.sliceBetween(to,null,depth),result=void 0;return before.type.canContainFragment(repl.content)?(result=repl.content.size?before.append(repl.content,from.depth-depth,repl.openLeft).append(after.content,repl.openRight,to.depth-depth):before.append(after.content,from.depth-depth,to.depth-depth),result.size||result.type.canBeEmpty||(result=result.copy(result.type.defaultContent())),{doc:result,moved:findMovedChunks(node,to,result,depth)}):null}var pos=root[depth],result=replace(node.child(pos),from,to,root,repl,depth+1);return result?{doc:node.replace(pos,result.doc),moved:result.moved}:null}function shiftFromStack(stack,depth){for(var shifted=stack[depth]=stack[depth].splice(0,1,_model.emptyFragment),i=depth-1;i>=0;i--)shifted=stack[i]=stack[i].replace(0,shifted)}function buildInserted(nodesLeft,source,start,end){for(var sliced=source.sliceBetween(start,end),nodesRight=[],node=sliced,i=0;i<=start.path.length;i++,node=node.firstChild)nodesRight.push(node);var same=(0,_tree.samePathDepth)(start,end),searchLeft=nodesLeft.length-1,searchRight=nodesRight.length-1,result=null,inner=nodesRight[searchRight];for(inner.isTextblock&&inner.size&&nodesLeft[searchLeft].isTextblock&&(result=nodesLeft[searchLeft--].copy(inner.content),--searchRight,shiftFromStack(nodesRight,searchRight));;){for(var node=nodesRight[searchRight],type=node.type,matched=null,outside=same>=searchRight,i=searchLeft;i>=0;i--){var left=nodesLeft[i];if(outside?left.type.canContainContent(node.type):left.type==type){matched=i;break}}if(null!=matched)if(result)for(;searchLeft>=matched;){var wrap=nodesLeft[searchLeft],content=_model.Fragment.from(result);result=wrap.copy(searchLeft==matched?content.append(node.content):content),searchLeft--}else result=nodesLeft[matched].copy(node.content),searchLeft=matched-1;if(null!=matched||0==node.size){if(outside)break;searchRight&&shiftFromStack(nodesRight,searchRight-1)}searchRight--}var repl={content:result?result.content:_model.emptyFragment,openLeft:start.depth-searchRight,openRight:end.depth-searchRight};return{repl:repl,depth:searchLeft+1}}function moveText(tr,doc,before,after){for(var root=(0,_tree.samePathDepth)(before,after),cutAt=after.shorten(null,1);cutAt.path.length>root&&1==doc.path(cutAt.path).size;)cutAt=cutAt.shorten(null,1);tr.split(cutAt,cutAt.path.length-root);for(var start=after,end=new _model.Pos(start.path,doc.path(start.path).size),parent=doc.path(start.path.slice(0,root)),wanted=parent.pathNodes(before.path.slice(root)),existing=parent.pathNodes(start.path.slice(root));wanted.length&&existing.length&&wanted[0].sameMarkup(existing[0]);)wanted.shift(),existing.shift();(existing.length||wanted.length)&&tr.step("ancestor",start,end,null,{depth:existing.length,types:wanted.map(function(n){return n.type}),attrs:wanted.map(function(n){return n.attrs})});for(var i=root;imaxDepth;)repl.content.size&&(repl={content:_model.Fragment.from(doc.path(from.path.slice(0,depth)).copy(repl.content)),openLeft:repl.openLeft+1,openRight:repl.openRight+1}),depth--}else repl=nullRepl,depth=maxDepth;var root=from.shorten(depth),docAfter=doc,after=to;if(repl.content.size||(0,_tree.replaceHasEffect)(doc,from,to)){var result=this.step("replace",from,to,root,repl);docAfter=result.doc,after=result.map.map(to).pos}if(!doc.path(to.path).isTextblock)return this;if(!(repl.content.size?source.path(end.path).isTextblock:doc.path(from.path).isTextblock))return this;var nodesAfter=doc.path(root.path).pathNodes(to.path.slice(depth)).slice(1),nodesBefore=void 0;if(repl.content.size){var inserted=repl.content;nodesBefore=[];for(var i=0;ioff;off++){var here=pos.shorten(pos.depth-off);here.offset&&here.offset0)return!0}return gapStart!=gapEnd?!0:canBeJoined(node,gapStart,Math.min(from.depth,to.depth)-depth)}node=node.child(from.path[depth])}}function samePathDepth(a,b){for(var i=0;;i++)if(i==a.path.length||i==b.path.length||a.path[i]!=b.path[i])return i}Object.defineProperty(exports,"__esModule",{value:!0}),exports.copyStructure=copyStructure,exports.copyInline=copyInline,exports.isFlatRange=isFlatRange,exports.replaceHasEffect=replaceHasEffect,exports.samePathDepth=samePathDepth;var _model=require("../model")},{"../model":30}],45:[function(require,module,exports){"use strict";function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function defineProperties(target,props){for(var i=0;i=MIN_FLUSH_DELAY&&(this.lastFlush=now,clearTimeout(this.timeout),this.mustUpdate=!1,this.update=this.prepare())}},{key:"onFlushed",value:function(){this.update&&(this.update(),this.update=null)}},{key:"onEvent",value:function(){this.mustUpdate=!0,clearTimeout(this.timeout),this.timeout=setTimeout(this.force,UPDATE_TIMEOUT)}},{key:"force",value:function(){if(this.pm.operation)this.onEvent();else{this.mustUpdate=!1,this.updateInfo=null,this.lastFlush=Date.now(),clearTimeout(this.timeout);var update=this.prepare();update&&update()}}}]),UpdateScheduler}();exports.UpdateScheduler=UpdateScheduler},{}],47:[function(require,module,exports){"use strict";function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor))throw new TypeError("Cannot call a class as a function")}function _inherits(subClass,superClass){if("function"!=typeof superClass&&null!==superClass)throw new TypeError("Super expression must either be null or a function, not "+typeof superClass);subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,enumerable:!1,writable:!0,configurable:!0}}),superClass&&(Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__=superClass)}function functionName(f){var match=/^function (\w+)/.exec(f.toString());return match&&match[1]}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function defineProperties(target,props){for(var i=0;i1?_len-1:0),_key=1;_len>_key;_key++)values[_key-1]=arguments[_key];if(arr)for(var i=0;i1?_len2-1:0),_key2=1;_len2>_key2;_key2++)values[_key2-1]=arguments[_key2];for(var i=0;i0}}},{}],49:[function(require,module,exports){"use strict";function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function defineProperties(target,props){for(var i=0;i-1?this.content[found+1]=value:this.content.push(key,value)}},{key:"get",value:function(key){var found=this.find(key);return-1==found?void 0:this.content[found+1]}},{key:"has",value:function(key){return this.find(key)>-1}},{key:"find",value:function(key){for(var i=0;i0);i++);array.splice(i,0,elt)}Object.defineProperty(exports,"__esModule",{value:!0}),exports["default"]=sortedInsert,module.exports=exports["default"]},{}],51:[function(require,module,exports){!function(mod){if("object"==typeof exports&&"object"==typeof module)module.exports=mod();else{if("function"==typeof define&&define.amd)return define([],mod);(this||window).browserKeymap=mod()}}(function(){"use strict";function keyName(event){if("keypress"==event.type)return"'"+String.fromCharCode(event.charCode)+"'";var base=keyNames[event.keyCode],name=base;return null==name||event.altGraphKey?null:(event.altKey&&"Alt"!=base&&(name="Alt-"+name),event.ctrlKey&&"Ctrl"!=base&&(name="Ctrl-"+name),event.metaKey&&"Cmd"!=base&&(name="Cmd-"+name),event.shiftKey&&"Shift"!=base&&(name="Shift-"+name),name)}function isModifierKey(name){return name=/[^-]*$/.exec(name)[0],"Ctrl"==name||"Alt"==name||"Shift"==name||"Mod"==name}function normalizeKeyName(name){for(var alt,ctrl,shift,cmd,parts=name.split(/-(?!'?$)/),result=parts[parts.length-1],i=0;ii;i++)keyNames[i+48]=keyNames[i+96]=String(i);for(var i=65;90>=i;i++)keyNames[i]=String.fromCharCode(i);for(var i=1;12>=i;i++)keyNames[i+111]=keyNames[i+63235]="F"+i;return Keymap.prototype={normalize:function(name){return this.options.multi!==!1?name.split(/ +(?!\'$)/).map(normalizeKeyName):[normalizeKeyName(name)]},addBinding:function(keyname,value){for(var keys=this.normalize(keyname),i=0;i=0;i--){var name=keys.slice(0,i).join(" "),val=this.bindings[name];if("..."==val&&!this.unusedMulti(name))break;val&&delete this.bindings[name]}},unusedMulti:function(name){for(var binding in this.bindings)if(binding.length>name&&0==binding.indexOf(name)&&" "==binding.charAt(name.length))return!1;return!0},lookup:function(key,context){return this.options.call?this.options.call(key,context):this.bindings[key]},constructor:Keymap},Keymap.keyName=keyName,Keymap.isModifierKey=isModifierKey,Keymap.normalizeKeyName=normalizeKeyName,Keymap})},{}],52:[function(require,module,exports){"use strict";var _gitProsemirrorDistEdit=require("../../../git/prosemirror/dist/edit"),_gitProsemirrorDistDom=require("../../../git/prosemirror/dist/dom");require("../../../git/prosemirror/dist/menu/tooltipmenu"),require("../../../git/prosemirror/dist/menu/menubar"),require("../../../git/prosemirror/dist/inputrules/autoinput");var _utils=require("./utils"),_gitProsemirrorDistModel=require("../../../git/prosemirror/dist/model"),_widgets=require("./widgets"),widgetsSpec=new _gitProsemirrorDistModel.SchemaSpec({doc:_gitProsemirrorDistModel.Doc,blockquote:_gitProsemirrorDistModel.BlockQuote,ordered_list:_gitProsemirrorDistModel.OrderedList,bullet_list:_gitProsemirrorDistModel.BulletList,list_item:_gitProsemirrorDistModel.ListItem,horizontal_rule:_gitProsemirrorDistModel.HorizontalRule,paragraph:_gitProsemirrorDistModel.Paragraph,heading:_gitProsemirrorDistModel.Heading,text:_gitProsemirrorDistModel.Text,image:_widgets.Image,hard_break:_gitProsemirrorDistModel.HardBreak,input:_widgets.Input,textfield:_widgets.TextField,textarea:_widgets.TextArea,checkbox:_widgets.CheckBox,radiobutton:_widgets.RadioButton,select:_widgets.Select,inlinemath:_widgets.InlineMath,blockmath:_widgets.BlockMath,iframe:_widgets.IFrame,carryforward:_widgets.CarryForward,choice:_widgets.Choice,multiplechoice:_widgets.MultipleChoice,scale:_widgets.Scale,checkitem:_widgets.CheckItem,checklist:_widgets.CheckList,spreadsheet:_widgets.SpreadSheet,widget:_widgets.Widget},{em:_gitProsemirrorDistModel.EmMark,strong:_gitProsemirrorDistModel.StrongMark,link:_gitProsemirrorDistModel.LinkMark,code:_gitProsemirrorDistModel.CodeMark}),widgetSchema=new _gitProsemirrorDistModel.Schema(widgetsSpec);window.pm=new _gitProsemirrorDistEdit.ProseMirror({place:document.querySelector("#editor"),menuBar:!0,doc:document.querySelector("#content").innerHTML,docFormat:"html",schema:widgetSchema,commandParamHandler:"widgetParamHandler",autoInput:!0});(0,_utils.defineFileHandler)(function(files){console.log(files)}),(0,_gitProsemirrorDistDom.insertCSS)('\n \n.ProseMirror {\n width: 800px;\n min-height: 200px;\n}\n\ndiv.ProseMirror-select-menu {\n position: absolute;\n background: #0191C8;\n color: white;\n padding: 2px 2px;\n z-index: 15;\n}\n\ndiv.ProseMirror-select-menu div {\n cursor: pointer;\n padding: 0 1em 0 2px;\n}\n\ndiv.ProseMirror-select-menu div:hover {\n background: #D6F2F8;\n color: #0191C8;\n}\n\ndiv.ProseMirror-menubar-inner {\n background: linear-gradient(to bottom, white, #0191C8);\n}\n\ndiv.ProseMirror-menu form {\n background: linear-gradient(to bottom, white, #0191C8); //background: #D6F2F8;\n width: 300px;\n}\n\ndiv.ProseMirror-menu form select {\n width: 100px;\n background: white;\n}\n\ndiv.ProseMirror-menu input[type = "text"] {\n background: white;\n}\n\n/*div.ProseMirror-menubar-sliding {\n -webkit-transition: right 0.2s ease-in;\n -moz-transition: right 0.2s ease-in;\n transition: right 0.2s ease-in;\n position: relative;\n left: 100%;\n width: 100%;\n box-sizing: -moz-border-box;\n box-sizing: border-box;\n padding-left: 16px;\n background: #D6F2F8;\n}*/\n\n\n')},{"../../../git/prosemirror/dist/dom":1,"../../../git/prosemirror/dist/edit":9,"../../../git/prosemirror/dist/inputrules/autoinput":21,"../../../git/prosemirror/dist/menu/menubar":25,"../../../git/prosemirror/dist/menu/tooltipmenu":26,"../../../git/prosemirror/dist/model":30,"./utils":53,"./widgets":61}],53:[function(require,module,exports){"use strict";function defParser(type,tag,cls){type.register("parseDOM",{tag:tag,rank:25,parse:function(dom,context,type,attrs){var contains=dom.classList.contains(cls);return contains?void context.insertFrom(dom,type,attrs):!1}})}function selectClickedNode(pm,e){var pos=(0,_gitProsemirrorDistEditSelection.selectableNodeAbove)(pm,e.target,{left:e.clientX,top:e.clientY},!0);if(!pos)return pm.sel.pollForUpdate();var _pm$selection=pm.selection,node=_pm$selection.node,from=_pm$selection.from;if(node&&pos.depth>=from.depth&&0==pos.shorten(from.depth).cmp(from)){if(0==from.depth)return pm.sel.pollForUpdate();pos=from.shorten()}pm.setNodeSelection(pos),pm.focus(),e.preventDefault()}function defParamsClick(type,cmdname){type.prototype.handleClick=function(pm,e,path,node){var cmd=pm.commands[cmdname];return cmd?(selectClickedNode(pm,e),(0,_utils.widgetParamHandler)(pm,cmd),!0):!1}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.defParser=defParser,exports.defParamsClick=defParamsClick;var _gitProsemirrorDistEditSelection=(require("../../../../git/prosemirror/dist/menu/menu"),require("../../../../git/prosemirror/dist/model"),require("../../../../git/prosemirror/dist/edit/selection")),_utils=require("../utils"),_params=require("./params");Object.defineProperty(exports,"widgetParamHandler",{enumerable:!0,get:function(){return _params.widgetParamHandler}}),Object.defineProperty(exports,"defineFileHandler",{enumerable:!0,get:function(){return _params.defineFileHandler}});var andScroll={scrollIntoView:!0};exports.andScroll=andScroll;var namePattern="(\\w)+";exports.namePattern=namePattern,MathJax.Hub.Queue(function(){MathJax.Hub.Config({tex2jax:{displayMath:[["\\[","\\]"]],inlineMath:[["\\(","\\)"]],processEscapes:!0},displayAlign:"left"})})},{"../../../../git/prosemirror/dist/edit/selection":14,"../../../../git/prosemirror/dist/menu/menu":24,"../../../../git/prosemirror/dist/model":30,"../utils":53,"./params":54}],54:[function(require,module,exports){"use strict";function _toConsumableArray(arr){if(Array.isArray(arr)){for(var i=0,arr2=Array(arr.length);i=0){field=(0,_gitProsemirrorDistDom.elt)("input",{name:name,id:name,type:param.type,placeholder:param.label,value:val,autocomplete:"off",required:!0});for(var prop in opt)field.setAttribute(prop,opt[prop])}else if("file"==param.type){field=(0,_gitProsemirrorDistDom.elt)("input",{name:name,id:name,type:"text",readonly:!0,placeholder:param.label,value:val,autocomplete:"off",required:!0});for(var prop in opt)field.setAttribute(prop,opt[prop])}else{if("select"!=param.type)throw new Error("Unsupported parameter type: "+param.type);field=(0,_gitProsemirrorDistDom.elt)("select",{name:name},(param.options.call?param.options(pm):param.options).map(function(o){return(0,_gitProsemirrorDistDom.elt)("option",{value:o.value,selected:o.value==val},o.label)}))}var fieldLabel=(0,_gitProsemirrorDistDom.elt)("label",{"for":name},fname);if("file"==param.type){var uploadButton=(0,_gitProsemirrorDistDom.elt)("span",{"class":"widgetUpload"},"Upload");return uploadButton.addEventListener("click",function(e){buildUploadForm(pm,field)}),(0,_gitProsemirrorDistDom.elt)("div",{"class":"widgetField"},fieldLabel,field,uploadButton)}return(0,_gitProsemirrorDistDom.elt)("div",{"class":"widgetField"},fieldLabel,field)});return fields}function gatherParams(pm,command,form){var bad=!1,params=command.params.map(function(param,i){var f=form.elements["field_"+i];if(f.validity.valid){var val=f.value;if(val)return val;if(param["default"])return paramDefault(param,pm,command)}bad=!0});return bad?null:params}function paramDialog(pm,command,callback){var dialog=void 0,form=void 0,finish=function(e){e.preventDefault(),e.stopPropagation();var params=gatherParams(pm,command,form);params&&(pm.wrapper.removeChild(dialog),pm.focus(),callback(params))},fields=buildParamFields(pm,command),save=(0,_gitProsemirrorDistDom.elt)("input",{name:"save",type:"submit",value:"Save"});save.addEventListener("mousedown",function(e){finish(e)});var cancel=(0,_gitProsemirrorDistDom.elt)("input",{name:"cancel",type:"button",value:"Cancel"});cancel.addEventListener("mousedown",function(e){e.preventDefault(),e.stopPropagation(),pm.wrapper.removeChild(dialog),pm.focus()});var buttons=(0,_gitProsemirrorDistDom.elt)("div",{"class":"widgetButtons"},save,cancel);form=(0,_gitProsemirrorDistDom.elt)("form",{"class":"widgetForm"},(0,_gitProsemirrorDistDom.elt)("h4",null,command.label+" Settings"),fields,buttons),form.addEventListener("keypress",function(e){13==e.keyCode&&(1==fields.length?finish(e):(e.preventDefault(),e.stopPropagation()))}),dialog=(0,_gitProsemirrorDistDom.elt)("div",null,(0,_gitProsemirrorDistDom.elt)("div",{"class":"widgetDialog"}),form),pm.wrapper.appendChild(dialog),setTimeout(function(){var select=form.querySelector("select");select&&select.focus();var input=form.querySelector("input, textarea");input&&input.focus()},20)}function FileDragHover(e){e.stopPropagation(),e.preventDefault(),e.target.className="dragover"==e.type?"hover":""}function buildUploadForm(pm,field){var legend=(0,_gitProsemirrorDistDom.elt)("legend",null,"HTML File Upload"),inputHidden=(0,_gitProsemirrorDistDom.elt)("input",{type:"hidden",id:"MAX_FILE_SIZE",name:"MAX_FILE_SIZE",value:"300000"}),label=(0,_gitProsemirrorDistDom.elt)("label",{"for":"fileselect"},"File to upload:"),fileselect=(0,_gitProsemirrorDistDom.elt)("input",{id:"fileselect",type:"file",name:"fileselect[]",multiple:"multiple"}),filedrag=(0,_gitProsemirrorDistDom.elt)("div",{id:"filedrag"},"or drop files here"),cancel=(0,_gitProsemirrorDistDom.elt)("button",{type:"button"},"Cancel");cancel.addEventListener("click",function(e){e.preventDefault(),e.stopPropagation(),pm.wrapper.removeChild(form)});var saveFile=function(e){e.preventDefault(),e.stopPropagation(),FileDragHover(e);var files=e.target.files||e.dataTransfer.files;files&&(field.value=files[0].name),fhandler&&fhandler(files),pm.wrapper.removeChild(form)};fileselect.addEventListener("change",saveFile);var xhr=new XMLHttpRequest;xhr.upload&&(filedrag.addEventListener("dragover",FileDragHover),filedrag.addEventListener("dragleave",FileDragHover),filedrag.addEventListener("drop",saveFile),filedrag.style.display="block");var form=(0,_gitProsemirrorDistDom.elt)("form",{id:"upload",enctype:"multipart/form-data"},(0,_gitProsemirrorDistDom.elt)("fieldset",null,legend,inputHidden,(0,_gitProsemirrorDistDom.elt)("div",null,label,fileselect,filedrag),(0,_gitProsemirrorDistDom.elt)("div",null,cancel)));pm.wrapper.appendChild(form)}function widgetParamHandler(pm,command,callback){paramDialog(pm,command,function(params){var run=command.spec.run;params&&run&&run.call.apply(run,[command.self,pm].concat(_toConsumableArray(params)))})}Object.defineProperty(exports,"__esModule",{value:!0}),exports.defineFileHandler=defineFileHandler,exports.widgetParamHandler=widgetParamHandler;var _gitProsemirrorDistDom=require("../../../../git/prosemirror/dist/dom"),_gitProsemirrorDistEdit=require("../../../../git/prosemirror/dist/edit"),inputTypes=["text","number","range","email","url","date"],fhandler=null;(0,_gitProsemirrorDistEdit.defineParamHandler)("widgetParamHandler",widgetParamHandler),(0,_gitProsemirrorDistDom.insertCSS)('\n\n.widgetDialog {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: #FFF;\n z-index: 8888;\n opacity:0.8;\n font-family: Helvetica, Arial, Sans-Serif;\n}\n\n.widgetForm {\n position: absolute;\n top: 20px;\n left: 20px;\n padding: 5px;\n border-radius: 6px;\n background: #0191C8;\n z-index: 9999;\n display: block;\n}\n\n.widgetForm h4 {\n color: white;\n margin: 4px;\n}\n\n.widgetField {\n display: block;\n padding: 2px;\n}\n\n.widgetField label {\n width: 80px;\n color: white;\n display: inline-block;\n padding: 2px;\n float: left;\n}\n\n.widgetField input {\n margin: 2px;\n display: inline;\n}\n\n.widgetField input[type = "number"] {\n width: 60px;\n margin: 2px;\n display: inline;\n}\n.widgetFieldName {\n color: white;\n display: inline;\n padding: 4px;\n}\n\n.widgetButtons {\n text-align: center;\n}\n\n.widgetButtons input {\n margin: 5px;\n}\n\n.widgetUpload {\n cursor: pointer;\n color: white;\n border: 1px solid white;\n font-size: 80%;\n border-radius: 4px;\n padding: 2px;\n}\n\n#upload {\n position: absolute;\n top: 40px;\n left: 40px;\n padding: 5px;\n border-radius: 6px;\n background: #EEE;\n z-index: 10000;\n display: block;\n}\n\n#filedrag {\n display: none;\n font-weight: bold;\n text-align: center;\n padding: 1em 0;\n margin: 1em 0;\n color: #555;\n border: 2px dashed #555;\n border-radius: 7px;\n cursor: default;\n}\n\n#filedrag:hover {\n color: #f00;\n border-color: #f00;\n border-style: solid;\n box-shadow: inset 0 3px 4px #888;\n}\n\n')},{"../../../../git/prosemirror/dist/dom":1,"../../../../git/prosemirror/dist/edit":9}],55:[function(require,module,exports){"use strict";function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor))throw new TypeError("Cannot call a class as a function")}function _inherits(subClass,superClass){if("function"!=typeof superClass&&null!==superClass)throw new TypeError("Super expression must either be null or a function, not "+typeof superClass);subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,enumerable:!1,writable:!0,configurable:!0}}),superClass&&(Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__=superClass)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function defineProperties(target,props){for(var i=0;i0&&(content=[this.schema.node("checkbox",attrs)]),_get(Object.getPrototypeOf(CheckItem.prototype),"create",this).call(this,attrs,content,marks)}},{key:"attrs",get:function(){return{name:new _gitProsemirrorDistModel.Attribute,value:new _gitProsemirrorDistModel.Attribute}}}],[{key:"kind",get:function(){return"."}}]),CheckItem}(_gitProsemirrorDistModel.Paragraph);exports.CheckItem=CheckItem;var CheckList=function(_Block){function CheckList(){_classCallCheck(this,CheckList),_get(Object.getPrototypeOf(CheckList.prototype),"constructor",this).apply(this,arguments)}return _inherits(CheckList,_Block),_createClass(CheckList,[{key:"attrs",get:function(){return{name:new _gitProsemirrorDistModel.Attribute,title:new _gitProsemirrorDistModel.Attribute,layout:new _gitProsemirrorDistModel.Attribute({"default":"vertical"})}}}],[{key:"contains",get:function(){return"checkitem"}}]),CheckList}(_gitProsemirrorDistModel.Block);exports.CheckList=CheckList,(0,_utils.defParser)(CheckItem,"div","widgets-checkitem"),(0,_utils.defParser)(CheckList,"div","widgets-checklist"),CheckItem.prototype.serializeDOM=function(node,s){return s.renderAs(node,"p",{name:node.attrs.name+"-"+node.attrs.value,value:node.attrs.value,"class":"widgets-checkitem"})},CheckList.prototype.serializeDOM=function(node,s){return s.renderAs(node,"div",{name:node.attrs.name,title:node.attrs.title,layout:node.attrs.layout,"class":"widgets-checklist"})},CheckItem.register("command",{name:"splitCheckitem",label:"Split the current checkitem",run:function(pm){var _pm$selection=pm.selection,node=_pm$selection.node,from=_pm$selection.from,to=_pm$selection.to;if(node&&node.isBlock||from.path.length<2||!_gitProsemirrorDistModel.Pos.samePath(from.path,to.path))return!1;var toParent=from.shorten(),grandParent=pm.doc.path(toParent.path);return"checklist"!=grandParent.type.name?!1:pm.tr["delete"](from,to).split(from,1,pm.schema.nodes.checkitem,{name:grandParent.attrs.name,value:grandParent.size}).apply(_utils.andScroll)},keys:["Enter(50)"]}),CheckList.register("command",{name:"insertCheckList",label:"CheckList",run:function(pm,name,title,layout){var node=pm.selection.node,chklist=this.create({name:name,title:title,layout:layout},node?node.content:pm.schema.nodes.checkitem.create({name:name,value:0}));return pm.tr.replaceSelection(chklist).apply(_utils.andScroll)},params:[{name:"Name",label:"Short ID name",type:"text",options:{pattern:_utils.namePattern,size:10}},{name:"Title",label:"Title",type:"text"},{name:"Layout",label:"vertical or horizontal",type:"select",options:[{value:"horizontal",label:"horizontal"},{value:"vertical",label:"vertical"}]}],prefillParams:function(pm){var node=pm.selection.node;return node&&node.type==this?[node.attrs.name,node.attrs.title,node.attrs.layout]:void 0}}),CheckItem.register("command",{name:"splitCheckItem",label:"Split the current checkitem",run:function(pm){var _pm$selection2=pm.selection,node=_pm$selection2.node,from=_pm$selection2.from,to=_pm$selection2.to;if(node&&node.isBlock||from.path.length<2||!_gitProsemirrorDistModel.Pos.samePath(from.path,to.path))return!1;var toParent=from.shorten(),grandParent=pm.doc.path(toParent.path);return pm.tr["delete"](from,to).split(from,1,pm.schema.nodes.checkitem,{name:grandParent.attrs.name+"-"+grandParent.size,value:grandParent.size}).apply(_utils.andScroll)},keys:["Enter(50)"]}),CheckItem.register("command",{name:"deleteCheckItem",label:"delete this checkitem or checklist",run:function(pm){var _pm$selection3=pm.selection,head=_pm$selection3.head,empty=_pm$selection3.empty;if(!empty||head.offset>1)return!1;for(var before=void 0,cut=void 0,i=head.path.length-1;!before&&i>=0;i--)head.path[i]>0&&(cut=head.shorten(i),before=pm.doc.path(cut.path).child(cut.offset-1));var mc=pm.doc.path(cut.path).child(cut.offset);return"checkitem"==mc.type.name?pm.tr["delete"](cut,cut.move(1)).apply(_utils.andScroll):1==mc.size?pm.tr["delete"](cut,cut.move(1)).apply(_utils.andScroll):!1},keys:["Backspace(50)","Mod-Backspace(50)"]}),(0,_utils.defParamsClick)(CheckList,"schema:checklist:insertCheckList"),(0,_gitProsemirrorDistDom.insertCSS)("\n\n.ProseMirror .widgets-checkitem {\n cursor: text;\n}\n\n.widgets-checklist:before {\n content: attr(title);\n color: black;\n font-weight: bold;\n}\n\n.ProseMirror .widgets-checklist:hover {\n cursor: pointer;\n}\n")},{"../../../../git/prosemirror/dist/dom":1,"../../../../git/prosemirror/dist/model":30,"../utils":53}],59:[function(require,module,exports){"use strict";function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor))throw new TypeError("Cannot call a class as a function")}function _inherits(subClass,superClass){if("function"!=typeof superClass&&null!==superClass)throw new TypeError("Super expression must either be null or a function, not "+typeof superClass);subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,enumerable:!1,writable:!0,configurable:!0}}),superClass&&(Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__=superClass)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function defineProperties(target,props){for(var i=0;i0&&(content=[this.schema.node("radiobutton",attrs),this.schema.node("paragraph")]),_get(Object.getPrototypeOf(Choice.prototype),"create",this).call(this,attrs,content,marks)}},{key:"attrs",get:function(){return{name:new _gitProsemirrorDistModel.Attribute,value:new _gitProsemirrorDistModel.Attribute}}}],[{key:"kind",get:function(){return"."}}]),Choice}(_gitProsemirrorDistModel.Paragraph);exports.Choice=Choice;var MultipleChoice=function(_Block){function MultipleChoice(){_classCallCheck(this,MultipleChoice),_get(Object.getPrototypeOf(MultipleChoice.prototype),"constructor",this).apply(this,arguments)}return _inherits(MultipleChoice,_Block),_createClass(MultipleChoice,[{key:"attrs",get:function(){return{name:new _gitProsemirrorDistModel.Attribute,title:new _gitProsemirrorDistModel.Attribute}}}],[{key:"contains",get:function(){return"choice"}}]),MultipleChoice}(_gitProsemirrorDistModel.Block);exports.MultipleChoice=MultipleChoice,(0,_utils.defParser)(Choice,"p","widgets-choice"),(0,_utils.defParser)(MultipleChoice,"div","widgets-multiplechoice"),Choice.prototype.serializeDOM=function(node,s){return s.renderAs(node,"p",{name:node.attrs.name,value:node.attrs.value,"class":"widgets-choice"})},MultipleChoice.prototype.serializeDOM=function(node,s){return s.renderAs(node,"div",{name:node.attrs.name,title:node.attrs.title,"class":"widgets-multiplechoice"})},Choice.register("command",{name:"splitChoice",label:"Split the current choice",run:function(pm){var _pm$selection=pm.selection,node=_pm$selection.node,from=_pm$selection.from,to=_pm$selection.to;if(node&&node.isBlock||from.path.length<2||!_gitProsemirrorDistModel.Pos.samePath(from.path,to.path))return!1;var toParent=from.shorten(),grandParent=pm.doc.path(toParent.path);return"multiplechoice"!=grandParent.type.name?!1:pm.tr["delete"](from,to).split(from,1,pm.schema.nodes.choice,{name:grandParent.attrs.name,value:grandParent.size}).apply(_utils.andScroll)},keys:["Enter(5)"]}),Choice.register("command",{name:"deleteChoice",label:"delete this choice or multiplechoice",run:function(pm){var _pm$selection2=pm.selection,head=_pm$selection2.head,empty=_pm$selection2.empty;if(!empty||head.offset>1)return!1;for(var before=void 0,cut=void 0,i=head.path.length-1;!before&&i>=0;i--)head.path[i]>0&&(cut=head.shorten(i),before=pm.doc.path(cut.path).child(cut.offset-1));var mc=pm.doc.path(cut.path).child(cut.offset);return"choice"==mc.type.name?pm.tr["delete"](cut,cut.move(1)).apply():1==mc.size?pm.tr["delete"](cut,cut.move(1)).apply():!1},keys:["Backspace(50)","Mod-Backspace(50)"]}),MultipleChoice.register("command",{name:"insertMultipleChoice",label:"MultipleChoice",run:function(pm,name,title){var _pm$selection3=pm.selection,node=_pm$selection3.node,mc=(_pm$selection3.from,this.create({name:name,title:title},node?node.content:pm.schema.node("choice",{name:name,value:0}))),tr=pm.tr.replaceSelection(mc).apply(_utils.andScroll);return tr},select:function(pm){return pm.doc.path(pm.selection.from.path).type.canContainType(this)},params:[{name:"Name",label:"Short ID name",type:"text",options:{pattern:_utils.namePattern,size:10}},{name:"Title",label:"Description",type:"text"}],prefillParams:function(pm){var node=pm.selection.node;return node&&node.type==this?[node.attrs.name,node.attrs.title]:void 0}}),(0,_utils.defParamsClick)(MultipleChoice,"schema:multiplechoice:insertMultipleChoice"),(0,_gitProsemirrorDistDom.insertCSS)("\n\n.widgets-choice {\n}\n\n.widgets-multiplechoice:before {\n content: attr(title);\n color: black;\n font-size: 14px;\n font-weight: bold;\n}\n\n.ProseMirror .widgets-choice:hover {\n cursor: text;\n}\n\n.ProseMirror .widgets-multiplechoice:hover {\n cursor: pointer;\n}\n")},{"../../../../git/prosemirror/dist/dom":1,"../../../../git/prosemirror/dist/edit/selection":14,"../../../../git/prosemirror/dist/model":30,"../utils":53}],65:[function(require,module,exports){"use strict";function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor))throw new TypeError("Cannot call a class as a function")}function _inherits(subClass,superClass){if("function"!=typeof superClass&&null!==superClass)throw new TypeError("Super expression must either be null or a function, not "+typeof superClass);subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,enumerable:!1,writable:!0,configurable:!0}}),superClass&&(Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__=superClass)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function defineProperties(target,props){for(var i=0;istartVal)for(var i=startVal;endVal>=i;i++){var _name=node.attrs.name+i;dom.appendChild((0,_gitProsemirrorDistDom.elt)("span",{"class":"widgets-scaleitem"},(0,_gitProsemirrorDistDom.elt)("label",{"for":_name},i.toString()),(0,_gitProsemirrorDistDom.elt)("input",{id:_name,name:node.attrs.name,type:"radio",value:i})))}else for(var i=startVal;i>=endVal;i--)dom.appendChild((0,_gitProsemirrorDistDom.elt)("span",{"class":"widgets-scaleitem"},(0,_gitProsemirrorDistDom.elt)("label",{ +"for":name},i.toString()),(0,_gitProsemirrorDistDom.elt)("input",{id:name,name:node.attrs.name,type:"radio",value:i})));return dom.appendChild((0,_gitProsemirrorDistDom.elt)("span",null," "+node.attrs.endlabel)),dom},Scale.register("command",{name:"insertScale",label:"Scale",run:function(pm,name,title,startvalue,startlabel,endvalue,endlabel){return pm.tr.replaceSelection(this.create({name:name,title:title,startvalue:startvalue,startlabel:startlabel,endvalue:endvalue,endlabel:endlabel})).apply(_utils.andScroll)},params:[{name:"Name",label:"Short ID name",type:"text",options:{pattern:_utils.namePattern,size:10}},{name:"Title",label:"Scale Title",type:"text"},{label:"Start value",type:"number","default":1},{name:"Start Label",label:"Text on left",type:"text","default":"low"},{label:"End value",type:"number","default":10},{name:"End Label",label:"Text on right",type:"text","default":"high"}],prefillParams:function(pm){var node=pm.selection.node;return node&&node.type==this?[node.attrs.name,node.attrs.title,node.attrs.startvalue,node.attrs.startlabel,node.attrs.endvalue,node.attrs.endlabel]:void 0}}),(0,_utils.defParamsClick)(Scale,"schema:scale:insertScale"),(0,_gitProsemirrorDistDom.insertCSS)("\n\n.widgets-scaleitem {\n display: inline-block;\n text-align: center;\n}\n\n.widgets-scaleitem input {\n display: block;\n}\n\n.widgets-scale:before {\n content: attr(title);\n color: black;\n font-size: 14px;\n font-weight: bold;\n display: block;\n}\n\n.widgets-scale span {\n vertical-align: middle;\n font-weight: normal;\n}\n\n.ProseMirror .widgets-scale:hover {\n cursor: pointer;\n}\n\n")},{"../../../../git/prosemirror/dist/dom":1,"../../../../git/prosemirror/dist/model":30,"../utils":53}],67:[function(require,module,exports){"use strict";function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor))throw new TypeError("Cannot call a class as a function")}function _inherits(subClass,superClass){if("function"!=typeof superClass&&null!==superClass)throw new TypeError("Super expression must either be null or a function, not "+typeof superClass);subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,enumerable:!1,writable:!0,configurable:!0}}),superClass&&(Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__=superClass)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function defineProperties(target,props){for(var i=0;i 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { - args[_key - 2] = arguments[_key]; - } - - for (var i = 0; i < args.length; i++) { - add(args[i], result); - }return result; -} - -function add(value, target) { - if (typeof value == "string") value = document.createTextNode(value); - if (Array.isArray(value)) { - for (var i = 0; i < value.length; i++) { - add(value[i], target); - } - } else { - target.appendChild(value); - } -} - -var reqFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame; - -function requestAnimationFrame(f) { - if (reqFrame) reqFrame(f);else setTimeout(f, 10); -} - -var ie_upto10 = /MSIE \d/.test(navigator.userAgent); -var ie_11up = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent); - -var browser = { - mac: /Mac/.test(navigator.platform), - ie_upto10: ie_upto10, - ie_11up: ie_11up, - ie: ie_upto10 || ie_11up, - gecko: /gecko\/\d/i.test(navigator.userAgent) -}; - -exports.browser = browser; -function classTest(cls) { - return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*"); -} - -function rmClass(node, cls) { - var current = node.className; - var match = classTest(cls).exec(current); - if (match) { - var after = current.slice(match.index + match[0].length); - node.className = current.slice(0, match.index) + (after ? match[1] + after : ""); - } -} - -function addClass(node, cls) { - var current = node.className; - if (!classTest(cls).test(current)) node.className += (current ? " " : "") + cls; -} - -function contains(parent, child) { - // Android browser and IE will return false if child is a text node. - if (child.nodeType != 1) child = child.parentNode; - return child && parent.contains(child); -} - -function insertCSS(css) { - var style = document.createElement("style"); - style.textContent = css; - document.head.insertBefore(style, document.head.firstChild); -} - -},{}],2:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _selection = require("./selection"); - -var _dom = require("../dom"); - -var _keys = require("./keys"); - -function nothing() {} - -function ensureSelection(pm) { - if (pm.selection.node) { - var found = (0, _selection.findSelectionNear)(pm.doc, pm.selection.from, 1, true); - if (found) (0, _selection.setDOMSelectionToPos)(pm, found.head); - } - return false; -} - -// A backdrop keymap used to make sure we always suppress keys that -// have a dangerous default effect, even if the commands they are -// bound to return false, and to make sure that cursor-motion keys -// find a cursor (as opposed to a node selection) when pressed. - -var keys = { - "Esc": nothing, - "Enter": nothing, - "Mod-Enter": nothing, - "Shift-Enter": nothing, - "Backspace": nothing, - "Delete": nothing, - "Mod-B": nothing, - "Mod-I": nothing, - "Mod-Backspace": nothing, - "Mod-Delete": nothing, - "Shift-Backspace": nothing, - "Shift-Delete": nothing, - "Shift-Mod-Backspace": nothing, - "Shift-Mod-Delete": nothing, - "Mod-Z": nothing, - "Mod-Y": nothing, - "Shift-Mod-Z": nothing, - "Ctrl-D": nothing, - "Ctrl-H": nothing, - "Ctrl-Alt-Backspace": nothing, - "Alt-D": nothing, - "Alt-Delete": nothing, - "Alt-Backspace": nothing, - - "Mod-A": ensureSelection -};["Left", "Right", "Up", "Down", "Home", "End", "PageUp", "PageDown"].forEach(function (key) { - keys[key] = keys["Shift-" + key] = keys["Mod-" + key] = keys["Shift-Mod-" + key] = keys["Alt-" + key] = keys["Shift-Alt-" + key] = ensureSelection; -});["Left", "Mod-Left", "Right", "Mod-Right", "Up", "Down"].forEach(function (key) { - return delete keys[key]; -}); - -if (_dom.browser.mac) keys["Ctrl-F"] = keys["Ctrl-B"] = keys["Ctrl-P"] = keys["Ctrl-N"] = keys["Alt-F"] = keys["Alt-B"] = keys["Ctrl-A"] = keys["Ctrl-E"] = keys["Ctrl-V"] = keys["goPageUp"] = ensureSelection; - -var captureKeys = new _keys.Keymap(keys); -exports.captureKeys = captureKeys; - -},{"../dom":1,"./keys":11,"./selection":15}],3:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.isWordChar = isWordChar; -exports.charCategory = charCategory; -exports.isExtendingChar = isExtendingChar; -var nonASCIISingleCaseWordChar = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/; - -// Extending unicode characters. A series of a non-extending char + -// any number of extending chars is treated as a single unit as far -// as editing and measuring is concerned. This is not fully correct, -// since some scripts/fonts/browsers also treat other configurations -// of code points as a group. -var extendingChar = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/; - -function isWordChar(ch) { - return (/\w/.test(ch) || isExtendingChar(ch) || ch > "\x80" && (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch)) - ); -} - -/** - * Get the category of a given character. Either a "space", - * a character that can be part of a word ("word"), or anything else ("other"). - * - * @param {string} ch The character. - * @return {string} - */ - -function charCategory(ch) { - return (/\s/.test(ch) ? "space" : isWordChar(ch) ? "word" : "other" - ); -} - -function isExtendingChar(ch) { - return ch.charCodeAt(0) >= 768 && extendingChar.test(ch); -} - -},{}],4:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _slicedToArray = (function () { - function sliceIterator(arr, i) { - var _arr = [];var _n = true;var _d = false;var _e = undefined;try { - for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { - _arr.push(_s.value);if (i && _arr.length === i) break; - } - } catch (err) { - _d = true;_e = err; - } finally { - try { - if (!_n && _i["return"]) _i["return"](); - } finally { - if (_d) throw _e; - } - }return _arr; - }return function (arr, i) { - if (Array.isArray(arr)) { - return arr; - } else if (Symbol.iterator in Object(arr)) { - return sliceIterator(arr, i); - } else { - throw new TypeError("Invalid attempt to destructure non-iterable instance"); - } - }; -})(); - -var _createClass = (function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); - } - }return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; - }; -})(); - -exports.defineParamHandler = defineParamHandler; -exports.initCommands = initCommands; -exports.defaultKeymap = defaultKeymap; - -function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { "default": obj }; -} - -function _toConsumableArray(arr) { - if (Array.isArray(arr)) { - for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];return arr2; - } else { - return Array.from(arr); - } -} - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -var _model = require("../model"); - -var _transform = require("../transform"); - -var _dom = require("../dom"); - -var _utilSortedinsert = require("../util/sortedinsert"); - -var _utilSortedinsert2 = _interopRequireDefault(_utilSortedinsert); - -var _char = require("./char"); - -var _keys = require("./keys"); - -var _selection = require("./selection"); - -var _options = require("./options"); - -var paramHandlers = Object.create(null); - -var empty = []; - -// FIXME document individual commands - -// ;; A command is a named piece of functionality that can be bound to -// a key, shown in the menu, or otherwise exposed to the user. -// -// The commands available in a given editor are gathered from the -// [registries](#registries) given to the editor, and the node and -// mark types in its [schema](#Schema.registry). Use the -// [`register`](#NodeType.register) method with `"command"` as the -// name and a `CommandSpec` as value to define a new command. - -var Command = (function () { - function Command(spec, self) { - _classCallCheck(this, Command); - - // :: string The name of the command. - this.name = spec.name; - if (!this.name) throw new Error("Trying to define a command without a name"); - // :: CommandSpec The command's specifying object. - this.spec = spec; - this.self = self; - } - - // ;; #path=CommandSpec #kind=interface #toc=false - // Commands are defined using objects that specify various aspects of - // the command. The only properties that _must_ appear in a command - // spec are [`name`](#CommandSpec.name) and [`run`](#CommandSpec.run). - // You should probably also give your commands a `label`. - - // :: string #path=CommandSpec.name - // The name of the command, which will be its key in - // `ProseMirror.commands`, and the thing passed to - // [`execCommand`](#ProseMirror.execCommand). - - // :: string #path=CommandSpec.label - // A user-facing label for the command. This will be used, among other - // things. as the tooltip title for the command's menu item. If there - // is no `label`, the command's `name` will be used instead. - - // :: (pm: ProseMirror, ...params: [any]) → ?bool #path=CommandSpec.run - // The function that executes the command. If the command has - // [parameters](#CommandSpec.params), their values are passed as - // arguments. For commands [registered](#NodeType.register) on node or - // mark types, `this` will be bound to the node or mark type when this - // function is ran. Should return `false` when the command could not - // be executed. - - // :: [CommandParam] #path=CommandSpec.params - // The parameters that this command expects. - - // :: (pm: ProseMirror) → bool #path=CommandSpec.select - // The function used to [select](#Command.select) the command. `this` - // will again be bound to a node or mark type, when available. - - // :: (pm: ProseMirror) → bool #path=CommandSpec.active - // The function used to determine whether the command is - // [active](#Command.active). `this` refers to the associated node or - // mark type. - - // :: union #path=CommandSpec.key - // The default key binding or bindings for this command. - - // :: union #path=CommandSpec.pcKey - // Default key binding or bindings specific to non-Mac platforms. - - // :: union #path=CommandSpec.macKey - // Default key binding or bindings specific to the Mac platform. - - // FIXME document menu and icon properties - - // ;; #path=CommandParam #kind=interface #toc=false - // The parameters that a command can take are specified using objects - // with the following properties: - - // :: string #path=CommandParam.label - // The user-facing name of the parameter. Shown to the user when - // prompting for this parameter. - - // :: string #path=CommandParam.type - // The type of the parameter. Supported types are `"text"` and `"select"`. - - // :: any #path=CommandParam.default - // A default value for the parameter. - - // :: (string, (pm: ProseMirror, cmd: Command, callback: (?[any]))) - // Register a parameter handler, which is a function that prompts the - // user to enter values for a command's [parameters](#CommandParam), and - // calls a callback with the values received. See also the - // [`commandParamHandler` option](#commandParamHandler). - - // :: (ProseMirror, ?[any]) → ?bool - // Execute this command. If the command takes - // [parameters](#Command.params), they can be passed as second - // argument here, or omitted, in which case a [parameter - // handler](#defineParamHandler) will be called to prompt the user - // for values. - // - // Returns the value returned by the command spec's [`run` - // method](#CommandSpec.run), or `false` if the command could not be - // ran. - - _createClass(Command, [{ - key: "exec", - value: function exec(pm, params) { - var _this = this; - - var run = this.spec.run; - if (!this.params.length) return run.call(this.self, pm); - if (params) return run.call.apply(run, [this.self, pm].concat(_toConsumableArray(params))); - var handler = getParamHandler(pm); - if (!handler) return false; - handler(pm, this, function (params) { - if (params) run.call.apply(run, [_this.self, pm].concat(_toConsumableArray(params))); - }); - } - - // :: (ProseMirror) → bool - // Ask this command whether it is currently relevant, given the - // editor's document and selection. If the command does not define a - // [`select`](#CommandSpec.select) method, this always returns true. - }, { - key: "select", - value: function select(pm) { - var f = this.spec.select; - return f ? f.call(this.self, pm) : true; - } - - // :: (ProseMirror) → bool - // Ask this command whether it is “active”. This is mostly used to - // style inline mark icons (such as strong) differently when the - // selection contains such marks. - }, { - key: "active", - value: function active(pm) { - var f = this.spec.active; - return f ? f.call(this.self, pm) : false; - } - - // :: [CommandParam] - // Get the list of parameters that this command expects. - }, { - key: "params", - get: function get() { - return this.spec.params || empty; - } - - // :: string - // Get the label for this command. - }, { - key: "label", - get: function get() { - return this.spec.label || this.name; - } - }]); - - return Command; -})(); - -exports.Command = Command; - -function defineParamHandler(name, handler) { - paramHandlers[name] = handler; -} - -function getParamHandler(pm) { - var option = pm.options.commandParamHandler; - if (option && paramHandlers[option]) return paramHandlers[option]; -} - -function initCommands(pm) { - var result = Object.create(null); - pm.registry("command", function (spec, type) { - result[spec.name] = new Command(spec, type); - }); - return result; -} - -function defaultKeymap(pm) { - var bindings = {}; - function add(command, key) { - if (Array.isArray(key)) { - for (var i = 0; i < key.length; i++) { - add(command, key[i]); - } - } else if (key) { - var _d$$exec = /^(.+?)(?:\((\d+)\))?$/.exec(key); - - var _d$$exec2 = _slicedToArray(_d$$exec, 3); - - var _ = _d$$exec2[0]; - var _name = _d$$exec2[1]; - var _d$$exec2$2 = _d$$exec2[2]; - var rank = _d$$exec2$2 === undefined ? 50 : _d$$exec2$2; - - (0, _utilSortedinsert2["default"])(bindings[_name] || (bindings[_name] = []), { command: command, rank: rank }, function (a, b) { - return a.rank - b.rank; - }); - } - } - for (var _name2 in pm.commands) { - var cmd = pm.commands[_name2]; - add(_name2, cmd.spec.key); - add(_name2, _dom.browser.mac ? cmd.spec.macKey : cmd.spec.pcKey); - } - - for (var key in bindings) { - bindings[key] = bindings[key].map(function (b) { - return b.command; - }); - }return new _keys.Keymap(bindings); -} - -var andScroll = { scrollIntoView: true }; - -_model.HardBreak.register("command", { - name: "insertHardBreak", - label: "Insert hard break", - run: function run(pm) { - var _pm$selection = pm.selection; - var node = _pm$selection.node; - var from = _pm$selection.from; - - if (node && node.isBlock) return false;else if (pm.doc.path(from.path).type.isCode) return pm.tr.typeText("\n").apply(andScroll);else return pm.tr.replaceSelection(this.create()).apply(andScroll); - }, - key: ["Mod-Enter", "Shift-Enter"] -}); - -function markActive(pm, type) { - var sel = pm.selection; - if (sel.empty) return type.isInSet(pm.activeMarks());else return pm.doc.rangeHasMark(sel.from, sel.to, type); -} - -function canAddInline(pm, type) { - var _pm$selection2 = pm.selection; - var from = _pm$selection2.from; - var to = _pm$selection2.to; - var empty = _pm$selection2.empty; - - if (empty) return !type.isInSet(pm.activeMarks()) && pm.doc.path(from.path).type.canContainMark(type); - var can = false; - pm.doc.nodesBetween(from, to, function (node) { - if (can || node.isTextblock && !node.type.canContainMark(type)) return false; - if (node.isInline && !type.isInSet(node.marks)) can = true; - }); - return can; -} - -function markApplies(pm, type) { - var _pm$selection3 = pm.selection; - var from = _pm$selection3.from; - var to = _pm$selection3.to; - - var relevant = false; - pm.doc.nodesBetween(from, to, function (node) { - if (node.isTextblock) { - if (node.type.canContainMark(type)) relevant = true; - return false; - } - }); - return relevant; -} - -function generateMarkCommands(type, name, labelName, spec) { - if (!labelName) labelName = name; - var cap = name.charAt(0).toUpperCase() + name.slice(1); - type.register("command", { - name: "set" + cap, - label: "Set " + labelName, - run: function run(pm) { - pm.setMark(this, true); - }, - select: function select(pm) { - return canAddInline(pm, this); - }, - icon: { from: name } - }); - type.register("command", { - name: "unset" + cap, - label: "Remove " + labelName, - run: function run(pm) { - pm.setMark(this, false); - }, - select: function select(pm) { - return markActive(pm, this); - }, - icon: { from: name } - }); - var command = { - name: name, - label: "Toggle " + labelName, - run: function run(pm) { - pm.setMark(this, null); - }, - active: function active(pm) { - return markActive(pm, this); - }, - select: function select(pm) { - return markApplies(pm, this); - } - }; - for (var prop in spec) { - command[prop] = spec[prop]; - }type.register("command", command); -} - -generateMarkCommands(_model.StrongMark, "strong", null, { - menuGroup: "inline", menuRank: 20, - icon: { - width: 805, height: 1024, - path: "M317 869q42 18 80 18 214 0 214-191 0-65-23-102-15-25-35-42t-38-26-46-14-48-6-54-1q-41 0-57 5 0 30-0 90t-0 90q0 4-0 38t-0 55 2 47 6 38zM309 442q24 4 62 4 46 0 81-7t62-25 42-51 14-81q0-40-16-70t-45-46-61-24-70-8q-28 0-74 7 0 28 2 86t2 86q0 15-0 45t-0 45q0 26 0 39zM0 950l1-53q8-2 48-9t60-15q4-6 7-15t4-19 3-18 1-21 0-19v-37q0-561-12-585-2-4-12-8t-25-6-28-4-27-2-17-1l-2-47q56-1 194-6t213-5q13 0 39 0t38 0q40 0 78 7t73 24 61 40 42 59 16 78q0 29-9 54t-22 41-36 32-41 25-48 22q88 20 146 76t58 141q0 57-20 102t-53 74-78 48-93 27-100 8q-25 0-75-1t-75-1q-60 0-175 6t-132 6z" - }, - key: "Mod-B" -}); - -generateMarkCommands(_model.EmMark, "em", "emphasis", { - menuGroup: "inline", menuRank: 21, - icon: { - width: 585, height: 1024, - path: "M0 949l9-48q3-1 46-12t63-21q16-20 23-57 0-4 35-165t65-310 29-169v-14q-13-7-31-10t-39-4-33-3l10-58q18 1 68 3t85 4 68 1q27 0 56-1t69-4 56-3q-2 22-10 50-17 5-58 16t-62 19q-4 10-8 24t-5 22-4 26-3 24q-15 84-50 239t-44 203q-1 5-7 33t-11 51-9 47-3 32l0 10q9 2 105 17-1 25-9 56-6 0-18 0t-18 0q-16 0-49-5t-49-5q-78-1-117-1-29 0-81 5t-69 6z" - }, - key: "Mod-I" -}); - -generateMarkCommands(_model.CodeMark, "code", null, { - menuGroup: "inline", menuRank: 22, - icon: { - width: 896, height: 1024, - path: "M608 192l-96 96 224 224-224 224 96 96 288-320-288-320zM288 192l-288 320 288 320 96-96-224-224 224-224-96-96z" - }, - key: "Mod-`" -}); - -_model.LinkMark.register("command", { - name: "unlink", - label: "Unlink", - run: function run(pm) { - pm.setMark(this, false); - }, - select: function select(pm) { - return markActive(pm, this); - }, - active: function active() { - return true; - }, - menuGroup: "inline", menuRank: 30, - icon: { from: "link" } -}); - -_model.LinkMark.register("command", { - name: "link", - label: "Add link", - run: function run(pm, href, title) { - pm.setMark(this, true, { href: href, title: title }); - }, - params: [{ label: "Target", type: "text" }, { label: "Title", type: "text", "default": "" }], - select: function select(pm) { - return markApplies(pm, this) && !markActive(pm, this); - }, - menuGroup: "inline", menuRank: 30, - icon: { - width: 951, height: 1024, - path: "M832 694q0-22-16-38l-118-118q-16-16-38-16-24 0-41 18 1 1 10 10t12 12 8 10 7 14 2 15q0 22-16 38t-38 16q-8 0-15-2t-14-7-10-8-12-12-10-10q-18 17-18 41 0 22 16 38l117 118q15 15 38 15 22 0 38-14l84-83q16-16 16-38zM430 292q0-22-16-38l-117-118q-16-16-38-16-22 0-38 15l-84 83q-16 16-16 38 0 22 16 38l118 118q15 15 38 15 24 0 41-17-1-1-10-10t-12-12-8-10-7-14-2-15q0-22 16-38t38-16q8 0 15 2t14 7 10 8 12 12 10 10q18-17 18-41zM941 694q0 68-48 116l-84 83q-47 47-116 47-69 0-116-48l-117-118q-47-47-47-116 0-70 50-119l-50-50q-49 50-118 50-68 0-116-48l-118-118q-48-48-48-116t48-116l84-83q47-47 116-47 69 0 116 48l117 118q47 47 47 116 0 70-50 119l50 50q49-50 118-50 68 0 116 48l118 118q48 48 48 116z" - } -}); - -_model.Image.register("command", { - name: "insertImage", - label: "Insert image", - run: function run(pm, src, alt, title) { - return pm.tr.replaceSelection(this.create({ src: src, title: title, alt: alt })).apply(andScroll); - }, - params: [{ label: "Image URL", type: "text" }, { label: "Description / alternative text", type: "text", "default": "" }, { label: "Title", type: "text", "default": "" }], - select: function select(pm) { - return pm.doc.path(pm.selection.from.path).type.canContainType(this); - }, - menuGroup: "inline", menuRank: 40, - icon: { - width: 1097, height: 1024, - path: "M365 329q0 45-32 77t-77 32-77-32-32-77 32-77 77-32 77 32 32 77zM950 548v256h-804v-109l182-182 91 91 292-292zM1005 146h-914q-7 0-12 5t-5 12v694q0 7 5 12t12 5h914q7 0 12-5t5-12v-694q0-7-5-12t-12-5zM1097 164v694q0 37-26 64t-64 26h-914q-37 0-64-26t-26-64v-694q0-37 26-64t64-26h914q37 0 64 26t26 64z" - }, - prefillParams: function prefillParams(pm) { - var node = pm.selection.node; - - if (node && node.type == this) return [node.attrs.src, node.attrs.alt, node.attrs.title]; - } -}); - -/** - * Get an offset moving backward from a current offset inside a node. - * - * @param {Object} parent The parent node. - * @param {int} offset Offset to move from inside the node. - * @param {string} by Size to delete by. Either "char" or "word". - */ -function moveBackward(parent, offset, by) { - if (by != "char" && by != "word") throw new Error("Unknown motion unit: " + by); - - var cat = null, - counted = 0; - for (;;) { - if (offset == 0) return offset; - - var _parent$chunkBefore = parent.chunkBefore(offset); - - var start = _parent$chunkBefore.start; - var node = _parent$chunkBefore.node; - - if (!node.isText) return cat ? offset : offset - 1; - - if (by == "char") { - for (var i = offset - start; i > 0; i--) { - if (!(0, _char.isExtendingChar)(node.text.charAt(i - 1))) return offset - 1; - offset--; - } - } else if (by == "word") { - // Work from the current position backwards through text of a singular - // character category (e.g. "cat" of "#!*") until reaching a character in a - // different category (i.e. the end of the word). - for (var i = offset - start; i > 0; i--) { - var nextCharCat = (0, _char.charCategory)(node.text.charAt(i - 1)); - if (cat == null || counted == 1 && cat == "space") cat = nextCharCat;else if (cat != nextCharCat) return offset; - offset--; - counted++; - } - } - } -} - -_options.defaultRegistry.register("command", { - name: "deleteSelection", - label: "Delete the selection", - run: function run(pm) { - return pm.tr.replaceSelection().apply(andScroll); - }, - key: ["Backspace(10)", "Delete(10)", "Mod-Backspace(10)", "Mod-Delete(10)"], - macKey: ["Ctrl-H(10)", "Alt-Backspace(10)", "Ctrl-D(10)", "Ctrl-Alt-Backspace(10)", "Alt-Delete(10)", "Alt-D(10)"] -}); - -function deleteBarrier(pm, cut) { - var around = pm.doc.path(cut.path); - var before = around.child(cut.offset - 1), - after = around.child(cut.offset); - if (before.type.canContainContent(after.type) && pm.tr.join(cut).apply(andScroll) !== false) return; - - var conn = undefined; - if (after.isTextblock && (conn = before.type.findConnection(after.type))) { - var tr = pm.tr, - end = cut.move(1); - tr.step("ancestor", cut, end, null, { types: [before.type].concat(_toConsumableArray(conn)), - attrs: [before.attrs].concat(_toConsumableArray(conn.map(function () { - return null; - }))) }); - tr.join(end); - tr.join(cut); - if (tr.apply(andScroll) !== false) return; - } - - var selAfter = (0, _selection.findSelectionFrom)(pm.doc, cut, 1); - return pm.tr.lift(selAfter.from, selAfter.to).apply(andScroll); -} - -_options.defaultRegistry.register("command", { - name: "joinBackward", - label: "Join with the block above", - run: function run(pm) { - var _pm$selection4 = pm.selection; - var head = _pm$selection4.head; - var empty = _pm$selection4.empty; - - if (!empty || head.offset > 0) return false; - - // Find the node before this one - var before = undefined, - cut = undefined; - for (var i = head.path.length - 1; !before && i >= 0; i--) { - if (head.path[i] > 0) { - cut = head.shorten(i); - before = pm.doc.path(cut.path).child(cut.offset - 1); - } - } // If there is no node before this, try to lift - if (!before) return pm.tr.lift(head).apply(andScroll); - - // If the node doesn't allow children, delete it - if (before.type.contains == null) return pm.tr["delete"](cut.move(-1), cut).apply(andScroll); - - // Apply the joining algorithm - return deleteBarrier(pm, cut); - }, - key: ["Backspace(30)", "Mod-Backspace(30)"] -}); - -_options.defaultRegistry.register("command", { - name: "deleteCharBefore", - label: "Delete a character before the cursor", - run: function run(pm) { - var _pm$selection5 = pm.selection; - var head = _pm$selection5.head; - var empty = _pm$selection5.empty; - - if (!empty || head.offset == 0) return false; - var from = moveBackward(pm.doc.path(head.path), head.offset, "char"); - return pm.tr["delete"](new _model.Pos(head.path, from), head).apply(andScroll); - }, - key: "Backspace(60)", - macKey: "Ctrl-H(40)" -}); - -_options.defaultRegistry.register("command", { - name: "deleteWordBefore", - label: "Delete the word before the cursor", - run: function run(pm) { - var _pm$selection6 = pm.selection; - var head = _pm$selection6.head; - var empty = _pm$selection6.empty; - - if (!empty || head.offset == 0) return false; - var from = moveBackward(pm.doc.path(head.path), head.offset, "word"); - return pm.tr["delete"](new _model.Pos(head.path, from), head).apply(andScroll); - }, - key: "Mod-Backspace(40)", - macKey: "Alt-Backspace(40)" -}); - -function moveForward(parent, offset, by) { - if (by != "char" && by != "word") throw new Error("Unknown motion unit: " + by); - - var cat = null, - counted = 0; - for (;;) { - if (offset == parent.size) return offset; - - var _parent$chunkAfter = parent.chunkAfter(offset); - - var start = _parent$chunkAfter.start; - var node = _parent$chunkAfter.node; - - if (!node.isText) return cat ? offset : offset + 1; - - if (by == "char") { - for (var i = offset - start; i < node.text.length; i++) { - if (!(0, _char.isExtendingChar)(node.text.charAt(i + 1))) return offset + 1; - offset++; - } - } else if (by == "word") { - for (var i = offset - start; i < node.text.length; i++) { - var nextCharCat = (0, _char.charCategory)(node.text.charAt(i)); - if (cat == null || counted == 1 && cat == "space") cat = nextCharCat;else if (cat != nextCharCat) return offset; - offset++; - counted++; - } - } - } -} - -_options.defaultRegistry.register("command", { - name: "joinForward", - label: "Join with the block below", - run: function run(pm) { - var _pm$selection7 = pm.selection; - var head = _pm$selection7.head; - var empty = _pm$selection7.empty; - - if (!empty || head.offset < pm.doc.path(head.path).size) return false; - - // Find the node after this one - var after = undefined, - cut = undefined; - for (var i = head.path.length - 1; !after && i >= 0; i--) { - cut = head.shorten(i, 1); - var _parent = pm.doc.path(cut.path); - if (cut.offset < _parent.size) after = _parent.child(cut.offset); - } - - // If there is no node after this, there's nothing to do - if (!after) return false; - - // If the node doesn't allow children, delete it - if (after.type.contains == null) return pm.tr["delete"](cut, cut.move(1)).apply(andScroll); - - // Apply the joining algorithm - return deleteBarrier(pm, cut); - }, - key: ["Delete(30)", "Mod-Delete(30)"] -}); - -_options.defaultRegistry.register("command", { - name: "deleteCharAfter", - label: "Delete a character after the cursor", - run: function run(pm) { - var _pm$selection8 = pm.selection; - var head = _pm$selection8.head; - var empty = _pm$selection8.empty; - - if (!empty || head.offset == pm.doc.path(head.path).size) return false; - var to = moveForward(pm.doc.path(head.path), head.offset, "char"); - return pm.tr["delete"](head, new _model.Pos(head.path, to)).apply(andScroll); - }, - key: "Delete(60)", - macKey: "Ctrl-D(60)" -}); - -_options.defaultRegistry.register("command", { - name: "deleteWordAfter", - label: "Delete a character after the cursor", - run: function run(pm) { - var _pm$selection9 = pm.selection; - var head = _pm$selection9.head; - var empty = _pm$selection9.empty; - - if (!empty || head.offset == pm.doc.path(head.path).size) return false; - var to = moveForward(pm.doc.path(head.path), head.offset, "word"); - return pm.tr["delete"](head, new _model.Pos(head.path, to)).apply(andScroll); - }, - key: "Mod-Delete(40)", - macKey: ["Ctrl-Alt-Backspace(40)", "Alt-Delete(40)", "Alt-D(40)"] -}); - -function joinPointAbove(pm) { - var _pm$selection10 = pm.selection; - var node = _pm$selection10.node; - var from = _pm$selection10.from; - - if (node) return (0, _transform.joinableBlocks)(pm.doc, from) ? from : null;else return (0, _transform.joinPoint)(pm.doc, from, -1); -} - -_options.defaultRegistry.register("command", { - name: "joinUp", - label: "Join with above block", - run: function run(pm) { - var node = pm.selection.node; - var point = joinPointAbove(pm); - if (!point) return false; - pm.tr.join(point).apply(); - if (node) pm.setNodeSelection(point.move(-1)); - }, - select: function select(pm) { - return joinPointAbove(pm); - }, - menuGroup: "block", menuRank: 80, - icon: { - width: 800, height: 900, - path: "M0 75h800v125h-800z M0 825h800v-125h-800z M250 400h100v-100h100v100h100v100h-100v100h-100v-100h-100z" - }, - key: "Alt-Up" -}); - -function joinPointBelow(pm) { - var _pm$selection11 = pm.selection; - var node = _pm$selection11.node; - var to = _pm$selection11.to; - - if (node) return (0, _transform.joinableBlocks)(pm.doc, to) ? to : null;else return (0, _transform.joinPoint)(pm.doc, to, 1); -} - -_options.defaultRegistry.register("command", { - name: "joinDown", - label: "Join with below block", - run: function run(pm) { - var node = pm.selection.node; - var point = joinPointBelow(pm); - if (!point) return false; - pm.tr.join(point).apply(); - if (node) pm.setNodeSelection(point.move(-1)); - }, - select: function select(pm) { - return joinPointBelow(pm); - }, - key: "Alt-Down" -}); - -_options.defaultRegistry.register("command", { - name: "lift", - label: "Lift out of enclosing block", - run: function run(pm) { - var _pm$selection12 = pm.selection; - var from = _pm$selection12.from; - var to = _pm$selection12.to; - - return pm.tr.lift(from, to).apply(andScroll); - }, - select: function select(pm) { - var _pm$selection13 = pm.selection; - var from = _pm$selection13.from; - var to = _pm$selection13.to; - - return (0, _transform.canLift)(pm.doc, from, to); - }, - menuGroup: "block", menuRank: 75, - icon: { - width: 1024, height: 1024, - path: "M219 310v329q0 7-5 12t-12 5q-8 0-13-5l-164-164q-5-5-5-13t5-13l164-164q5-5 13-5 7 0 12 5t5 12zM1024 749v109q0 7-5 12t-12 5h-987q-7 0-12-5t-5-12v-109q0-7 5-12t12-5h987q7 0 12 5t5 12zM1024 530v109q0 7-5 12t-12 5h-621q-7 0-12-5t-5-12v-109q0-7 5-12t12-5h621q7 0 12 5t5 12zM1024 310v109q0 7-5 12t-12 5h-621q-7 0-12-5t-5-12v-109q0-7 5-12t12-5h621q7 0 12 5t5 12zM1024 91v109q0 7-5 12t-12 5h-987q-7 0-12-5t-5-12v-109q0-7 5-12t12-5h987q7 0 12 5t5 12z" - }, - key: "Alt-Left" -}); - -function isAtTopOfListItem(doc, from, to, listType) { - return _model.Pos.samePath(from.path, to.path) && from.path.length >= 2 && from.path[from.path.length - 1] == 0 && listType.canContain(doc.path(from.path.slice(0, from.path.length - 1))); -} - -function wrapCommand(type, name, labelName, isList, spec) { - var command = { - name: "wrap" + name, - label: "Wrap in " + labelName, - run: function run(pm) { - var _pm$selection14 = pm.selection; - var from = _pm$selection14.from; - var to = _pm$selection14.to; - var head = _pm$selection14.head;var doJoin = false; - if (isList && head && isAtTopOfListItem(pm.doc, from, to, this)) { - // Don't do anything if this is the top of the list - if (from.path[from.path.length - 2] == 0) return false; - doJoin = true; - } - var tr = pm.tr.wrap(from, to, this); - if (doJoin) tr.join(from.shorten(from.depth - 2)); - return tr.apply(andScroll); - }, - select: function select(pm) { - var _pm$selection15 = pm.selection; - var from = _pm$selection15.from; - var to = _pm$selection15.to; - var head = _pm$selection15.head; - - if (isList && head && isAtTopOfListItem(pm.doc, from, to, this) && from.path[from.path.length - 2] == 0) return false; - return (0, _transform.canWrap)(pm.doc, from, to, this); - } - }; - for (var key in spec) { - command[key] = spec[key]; - }type.register("command", command); -} - -wrapCommand(_model.BulletList, "BulletList", "bullet list", true, { - menuGroup: "block", menuRank: 40, - icon: { - width: 768, height: 896, - path: "M0 512h128v-128h-128v128zM0 256h128v-128h-128v128zM0 768h128v-128h-128v128zM256 512h512v-128h-512v128zM256 256h512v-128h-512v128zM256 768h512v-128h-512v128z" - }, - key: ["Alt-Right '*'", "Alt-Right '-'"] -}); - -wrapCommand(_model.OrderedList, "OrderedList", "ordered list", true, { - menuGroup: "block", menuRank: 41, - icon: { - width: 768, height: 896, - path: "M320 512h448v-128h-448v128zM320 768h448v-128h-448v128zM320 128v128h448v-128h-448zM79 384h78v-256h-36l-85 23v50l43-2v185zM189 590c0-36-12-78-96-78-33 0-64 6-83 16l1 66c21-10 42-15 67-15s32 11 32 28c0 26-30 58-110 112v50h192v-67l-91 2c49-30 87-66 87-113l1-1z" - }, - key: "Alt-Right '1'" -}); - -wrapCommand(_model.BlockQuote, "BlockQuote", "block quote", false, { - menuGroup: "block", menuRank: 45, - icon: { - width: 640, height: 896, - path: "M0 448v256h256v-256h-128c0 0 0-128 128-128v-128c0 0-256 0-256 256zM640 320v-128c0 0-256 0-256 256v256h256v-256h-128c0 0 0-128 128-128z" - }, - key: ["Alt-Right '>'", "Alt-Right '\"'"] -}); - -_options.defaultRegistry.register("command", { - name: "newlineInCode", - label: "Insert newline", - run: function run(pm) { - var _pm$selection16 = pm.selection; - var from = _pm$selection16.from; - var to = _pm$selection16.to; - var node = _pm$selection16.node;var block = undefined; - if (!node && _model.Pos.samePath(from.path, to.path) && (block = pm.doc.path(from.path)).type.isCode && to.offset < block.size) return pm.tr.typeText("\n").apply(andScroll);else return false; - }, - key: "Enter(10)" -}); - -_options.defaultRegistry.register("command", { - name: "createParagraphNear", - label: "Create a paragraph near the selected leaf block", - run: function run(pm) { - var _pm$selection17 = pm.selection; - var from = _pm$selection17.from; - var to = _pm$selection17.to; - var node = _pm$selection17.node; - - if (!node || !node.isBlock || node.type.contains) return false; - var side = from.offset ? to : from; - pm.tr.insert(side, pm.schema.defaultTextblockType().create()).apply(andScroll); - pm.setTextSelection(new _model.Pos(side.toPath(), 0)); - }, - key: "Enter(20)" -}); - -_options.defaultRegistry.register("command", { - name: "liftEmptyBlock", - label: "Move current block up", - run: function run(pm) { - var _pm$selection18 = pm.selection; - var head = _pm$selection18.head; - var empty = _pm$selection18.empty; - - if (!empty || head.offset > 0 || pm.doc.path(head.path).size) return false; - if (head.depth > 1) { - var shorter = head.shorten(); - if (shorter.offset > 0 && shorter.offset < pm.doc.path(shorter.path).size - 1 && pm.tr.split(shorter).apply() !== false) return; - } - return pm.tr.lift(head).apply(andScroll); - }, - key: "Enter(30)" -}); - -_options.defaultRegistry.register("command", { - name: "splitBlock", - label: "Split the current block", - run: function run(pm) { - var _pm$selection19 = pm.selection; - var from = _pm$selection19.from; - var to = _pm$selection19.to; - var node = _pm$selection19.node;var block = pm.doc.path(to.path); - if (node && node.isBlock) { - if (!from.offset) return false; - return pm.tr.split(from).apply(andScroll); - } else { - var type = to.offset == block.size ? pm.schema.defaultTextblockType() : null; - return pm.tr["delete"](from, to).split(from, 1, type).apply(andScroll); - } - }, - key: "Enter(60)" -}); - -_model.ListItem.register("command", { - name: "splitListItem", - label: "Split the current list item", - run: function run(pm) { - var _pm$selection20 = pm.selection; - var from = _pm$selection20.from; - var to = _pm$selection20.to; - var node = _pm$selection20.node; - - if (node && node.isBlock || from.path.length < 2 || !_model.Pos.samePath(from.path, to.path)) return false; - var toParent = from.shorten(), - grandParent = pm.doc.path(toParent.path); - if (grandParent.type != this) return false; - var nextType = to.offset == grandParent.child(toParent.offset).size ? pm.schema.defaultTextblockType() : null; - return pm.tr["delete"](from, to).split(from, 2, nextType).apply(andScroll); - }, - key: "Enter(50)" -}); - -function alreadyHasBlockType(doc, from, to, type, attrs) { - var found = false; - if (!attrs) attrs = {}; - doc.nodesBetween(from, to || from, function (node) { - if (node.isTextblock) { - if (node.hasMarkup(type, attrs)) found = true; - return false; - } - }); - return found; -} - -function blockTypeCommand(type, name, labelName, attrs, key) { - if (!attrs) attrs = {}; - type.register("command", { - name: name, - label: "Change to " + labelName, - run: function run(pm) { - var _pm$selection21 = pm.selection; - var from = _pm$selection21.from; - var to = _pm$selection21.to; - - return pm.tr.setBlockType(from, to, this, attrs).apply(andScroll); - }, - select: function select(pm) { - var _pm$selection22 = pm.selection; - var from = _pm$selection22.from; - var to = _pm$selection22.to; - var node = _pm$selection22.node; - - if (node) return node.isTextblock && !node.hasMarkup(this, attrs);else return !alreadyHasBlockType(pm.doc, from, to, this, attrs); - }, - key: key - }); -} - -blockTypeCommand(_model.Heading, "makeH1", "heading 1", { level: 1 }, "Mod-H '1'"); -blockTypeCommand(_model.Heading, "makeH2", "heading 2", { level: 2 }, "Mod-H '2'"); -blockTypeCommand(_model.Heading, "makeH3", "heading 3", { level: 3 }, "Mod-H '3'"); -blockTypeCommand(_model.Heading, "makeH4", "heading 4", { level: 4 }, "Mod-H '4'"); -blockTypeCommand(_model.Heading, "makeH5", "heading 5", { level: 5 }, "Mod-H '5'"); -blockTypeCommand(_model.Heading, "makeH6", "heading 6", { level: 6 }, "Mod-H '6'"); - -blockTypeCommand(_model.Paragraph, "makeParagraph", "paragraph", null, "Mod-P"); -blockTypeCommand(_model.CodeBlock, "makeCodeBlock", "code block", null, "Mod-\\"); - -_model.HorizontalRule.register("command", { - name: "insertHorizontalRule", - label: "Insert horizontal rule", - run: function run(pm) { - return pm.tr.replaceSelection(this.create()).apply(andScroll); - }, - key: "Mod-Space" -}); - -_options.defaultRegistry.register("command", { - name: "undo", - label: "Undo last change", - run: function run(pm) { - pm.scrollIntoView();return pm.history.undo(); - }, - select: function select(pm) { - return pm.history.canUndo(); - }, - menuGroup: "history", menuRank: 10, - icon: { - width: 1024, height: 1024, - path: "M761 1024c113-206 132-520-313-509v253l-384-384 384-384v248c534-13 594 472 313 775z" - }, - key: "Mod-Z" -}); - -_options.defaultRegistry.register("command", { - name: "redo", - label: "Redo last undone change", - run: function run(pm) { - pm.scrollIntoView();return pm.history.redo(); - }, - select: function select(pm) { - return pm.history.canRedo(); - }, - menuGroup: "history", menuRank: 20, - icon: { - width: 1024, height: 1024, - path: "M576 248v-248l384 384-384 384v-253c-446-10-427 303-313 509-280-303-221-789 313-775z" - }, - key: ["Mod-Y", "Shift-Mod-Z"] -}); - -_options.defaultRegistry.register("command", { - name: "textblockType", - label: "Change block type", - run: function run(pm, type) { - var _pm$selection23 = pm.selection; - var from = _pm$selection23.from; - var to = _pm$selection23.to; - - return pm.tr.setBlockType(from, to, type.type, type.attrs).apply(); - }, - select: function select(pm) { - var node = pm.selection.node; - - return !node || node.isTextblock; - }, - params: [{ label: "Type", type: "select", options: listTextblockTypes, "default": currentTextblockType, defaultLabel: "Type..." }], - display: "select", - menuGroup: "block", menuRank: 10 -}); - -_model.Paragraph.prototype.textblockTypes = [{ label: "Normal", rank: 10 }]; -_model.CodeBlock.prototype.textblockTypes = [{ label: "Code", rank: 20 }]; -_model.Heading.prototype.textblockTypes = [1, 2, 3, 4, 5, 6].map(function (n) { - return { label: "Head " + n, attrs: { level: n }, rank: 30 + n }; -}); - -function listTextblockTypes(pm) { - var cached = pm.schema.cached.textblockTypes; - if (cached) return cached; - - var found = []; - for (var _name3 in pm.schema.nodes) { - var type = pm.schema.nodes[_name3]; - if (!type.textblockTypes) continue; - for (var i = 0; i < type.textblockTypes.length; i++) { - var info = type.textblockTypes[i]; - (0, _utilSortedinsert2["default"])(found, { label: info.label, value: { type: type, attrs: info.attrs }, rank: info.rank }, function (a, b) { - return a.rank - b.rank; - }); - } - } - return pm.schema.cached.textblockTypes = found; -} - -function currentTextblockType(pm) { - var _pm$selection24 = pm.selection; - var from = _pm$selection24.from; - var to = _pm$selection24.to; - var node = _pm$selection24.node; - - if (!node || node.isInline) { - if (!_model.Pos.samePath(from.path, to.path)) return null; - node = pm.doc.path(from.path); - } else if (!node.isTextblock) { - return null; - } - var types = listTextblockTypes(pm); - for (var i = 0; i < types.length; i++) { - var tp = types[i], - val = tp.value; - if (node.hasMarkup(val.type, val.attrs)) return tp; - } -} - -function nodeAboveSelection(pm) { - var sel = pm.selection, - i = 0; - if (sel.node) return !!sel.from.depth && sel.from.shorten(); - for (; i < sel.head.depth && i < sel.anchor.depth; i++) if (sel.head.path[i] != sel.anchor.path[i]) break; - return i == 0 ? false : sel.head.shorten(i - 1); -} - -_options.defaultRegistry.register("command", { - name: "selectParentBlock", - label: "Select parent node", - run: function run(pm) { - var node = nodeAboveSelection(pm); - if (!node) return false; - pm.setNodeSelection(node); - }, - select: function select(pm) { - return nodeAboveSelection(pm); - }, - menuGroup: "block", menuRank: 90, - icon: { text: "⬚", style: "font-weight: bold; vertical-align: 20%" }, - key: "Esc" -}); - -function moveSelectionBlock(pm, dir) { - var _pm$selection25 = pm.selection; - var from = _pm$selection25.from; - var to = _pm$selection25.to; - var node = _pm$selection25.node; - - var side = dir > 0 ? to : from; - return (0, _selection.findSelectionFrom)(pm.doc, node && node.isBlock ? side : side.shorten(null, dir > 0 ? 1 : 0), dir); -} - -function selectBlockHorizontally(pm, dir) { - var _pm$selection26 = pm.selection; - var empty = _pm$selection26.empty; - var node = _pm$selection26.node; - var from = _pm$selection26.from; - var to = _pm$selection26.to; - - if (!empty && !node) return false; - - if (node && node.isInline) { - pm.setTextSelection(dir > 0 ? to : from); - return true; - } - - var parent = undefined; - if (!node && (parent = pm.doc.path(from.path)) && (dir > 0 ? from.offset < parent.size : from.offset)) { - var _ref = dir > 0 ? parent.chunkAfter(from.offset) : parent.chunkBefore(from.offset); - - var nextNode = _ref.node; - var start = _ref.start; - - if (nextNode.type.selectable && start == from.offset - (dir > 0 ? 0 : 1)) { - pm.setNodeSelection(dir < 0 ? from.move(-1) : from); - return true; - } - return false; - } - - var next = moveSelectionBlock(pm, dir); - if (next && (next instanceof _selection.NodeSelection || node)) { - pm.setSelectionDirect(next); - return true; - } - return false; -} - -_options.defaultRegistry.register("command", { - name: "selectBlockLeft", - label: "Move the selection onto or out of the block to the left", - run: function run(pm) { - var done = selectBlockHorizontally(pm, -1); - if (done) pm.scrollIntoView(); - return done; - }, - key: ["Left", "Mod-Left"] -}); - -_options.defaultRegistry.register("command", { - name: "selectBlockRight", - label: "Move the selection onto or out of the block to the right", - run: function run(pm) { - var done = selectBlockHorizontally(pm, 1); - if (done) pm.scrollIntoView(); - return done; - }, - key: ["Right", "Mod-Right"] -}); - -function selectBlockVertically(pm, dir) { - var _pm$selection27 = pm.selection; - var empty = _pm$selection27.empty; - var node = _pm$selection27.node; - var from = _pm$selection27.from; - var to = _pm$selection27.to; - - if (!empty && !node) return false; - - var leavingTextblock = true; - if (!node || node.isInline) leavingTextblock = (0, _selection.verticalMotionLeavesTextblock)(pm, dir > 0 ? to : from, dir); - - if (leavingTextblock) { - var next = moveSelectionBlock(pm, dir); - if (next && next instanceof _selection.NodeSelection) { - pm.setSelectionDirect(next); - if (!node) pm.sel.lastNonNodePos = from; - return true; - } - } - - if (!node) return false; - - if (node.isInline) { - (0, _selection.setDOMSelectionToPos)(pm, from); - return false; - } - - var last = pm.sel.lastNonNodePos; - var beyond = (0, _selection.findSelectionFrom)(pm.doc, dir < 0 ? from : to, dir); - if (last && beyond && _model.Pos.samePath(last.path, beyond.from.path)) { - (0, _selection.setDOMSelectionToPos)(pm, last); - return false; - } - pm.setSelectionDirect(beyond); - return true; -} - -_options.defaultRegistry.register("command", { - name: "selectBlockUp", - label: "Move the selection onto or out of the block above", - run: function run(pm) { - var done = selectBlockVertically(pm, -1); - if (done !== false) pm.scrollIntoView(); - return done; - }, - key: "Up" -}); - -_options.defaultRegistry.register("command", { - name: "selectBlockDown", - label: "Move the selection onto or out of the block below", - run: function run(pm) { - var done = selectBlockVertically(pm, 1); - if (done !== false) pm.scrollIntoView(); - return done; - }, - key: "Down" -}); - -},{"../dom":1,"../model":27,"../transform":39,"../util/sortedinsert":51,"./char":3,"./keys":11,"./options":13,"./selection":15}],5:[function(require,module,exports){ -"use strict"; - -var _dom = require("../dom"); - -(0, _dom.insertCSS)("\n\n.ProseMirror {\n border: 1px solid silver;\n position: relative;\n}\n\n.ProseMirror-content {\n padding: 4px 8px 4px 14px;\n white-space: pre-wrap;\n line-height: 1.2;\n}\n\n.ProseMirror-drop-target {\n position: absolute;\n width: 1px;\n background: #666;\n display: none;\n}\n\n.ProseMirror-content ul.tight p, .ProseMirror-content ol.tight p {\n margin: 0;\n}\n\n.ProseMirror-content ul, .ProseMirror-content ol {\n padding-left: 30px;\n cursor: default;\n}\n\n.ProseMirror-content blockquote {\n padding-left: 1em;\n border-left: 3px solid #eee;\n margin-left: 0; margin-right: 0;\n}\n\n.ProseMirror-content pre {\n white-space: pre-wrap;\n}\n\n.ProseMirror-selectednode {\n outline: 2px solid #8cf;\n}\n\n.ProseMirror-content p:first-child,\n.ProseMirror-content h1:first-child,\n.ProseMirror-content h2:first-child,\n.ProseMirror-content h3:first-child,\n.ProseMirror-content h4:first-child,\n.ProseMirror-content h5:first-child,\n.ProseMirror-content h6:first-child {\n margin-top: .3em;\n}\n\n/* Add space around the hr to make clicking it easier */\n\n.ProseMirror-content hr {\n position: relative;\n height: 6px;\n border: none;\n}\n\n.ProseMirror-content hr:after {\n content: \"\";\n position: absolute;\n left: 10px;\n right: 10px;\n top: 2px;\n border-top: 2px solid silver;\n}\n\n.ProseMirror-content img {\n cursor: default;\n}\n\n/* Make sure li selections wrap around markers */\n\n.ProseMirror-content li {\n position: relative;\n pointer-events: none; /* Don't do weird stuff with marker clicks */\n}\n.ProseMirror-content li > * {\n pointer-events: auto;\n}\n\nli.ProseMirror-selectednode {\n outline: none;\n}\n\nli.ProseMirror-selectednode:after {\n content: \"\";\n position: absolute;\n left: -32px;\n right: -2px; top: -2px; bottom: -2px;\n border: 2px solid #8cf;\n pointer-events: none;\n}\n\n"); - -},{"../dom":1}],6:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.applyDOMChange = applyDOMChange; -exports.textContext = textContext; -exports.textInContext = textInContext; - -var _model = require("../model"); - -var _parseDom = require("../parse/dom"); - -var _transformTree = require("../transform/tree"); - -var _selection = require("./selection"); - -function isAtEnd(node, pos, depth) { - for (var i = depth || 0; i < pos.path.length; i++) { - var n = pos.path[depth]; - if (n < node.size - 1) return false; - node = node.child(n); - } - return pos.offset == node.size; -} -function isAtStart(pos, depth) { - if (pos.offset > 0) return false; - for (var i = depth || 0; i < pos.path.length; i++) { - if (pos.path[depth] > 0) return false; - }return true; -} - -function parseNearSelection(pm) { - var dom = pm.content, - node = pm.doc; - var _pm$selection = pm.selection; - var from = _pm$selection.from; - var to = _pm$selection.to; - - for (var depth = 0;; depth++) { - var toNode = node.child(to.path[depth]); - var fromStart = isAtStart(from, depth + 1); - var toEnd = isAtEnd(toNode, to, depth + 1); - if (fromStart || toEnd || from.path[depth] != to.path[depth] || toNode.isTextblock) { - var startOffset = depth == from.depth ? from.offset : from.path[depth]; - if (fromStart && startOffset > 0) startOffset--; - var endOffset = depth == to.depth ? to.offset : to.path[depth] + 1; - if (toEnd && endOffset < node.size - 1) endOffset++; - var parsed = (0, _parseDom.fromDOM)(pm.schema, dom, { topNode: node.copy(), - from: startOffset, - to: dom.childNodes.length - (node.size - endOffset) }); - parsed = parsed.copy(node.content.slice(0, startOffset).append(parsed.content).append(node.content.slice(endOffset))); - for (var i = depth - 1; i >= 0; i--) { - var wrap = pm.doc.path(from.path.slice(0, i)); - parsed = wrap.replace(from.path[i], parsed); - } - return parsed; - } - node = toNode; - dom = (0, _selection.findByPath)(dom, from.path[depth], false); - } -} - -function applyDOMChange(pm) { - var updated = parseNearSelection(pm); - var changeStart = (0, _model.findDiffStart)(pm.doc.content, updated.content); - if (changeStart) { - var changeEnd = findDiffEndConstrained(pm.doc.content, updated.content, changeStart); - // Mark nodes touched by this change as 'to be redrawn' - pm.markRangeDirty(pm.doc.siblingRange(changeStart, changeEnd.a)); - - pm.tr.replace(changeStart, changeEnd.a, updated, changeStart, changeEnd.b).apply(); - return true; - } else { - return false; - } -} - -function offsetBy(first, second, pos) { - var same = (0, _transformTree.samePathDepth)(first, second); - var firstEnd = same == first.depth, - secondEnd = same == second.depth; - var off = (secondEnd ? second.offset : second.path[same]) - (firstEnd ? first.offset : first.path[same]); - var shorter = firstEnd ? pos.move(off) : pos.shorten(same, off); - if (secondEnd) return shorter;else return shorter.extend(new _model.Pos(second.path.slice(same), second.offset)); -} - -function findDiffEndConstrained(a, b, start) { - var end = (0, _model.findDiffEnd)(a, b); - if (!end) return end; - if (end.a.cmp(start) < 0) return { a: start, b: offsetBy(end.a, start, end.b) }; - if (end.b.cmp(start) < 0) return { a: offsetBy(end.b, start, end.a), b: start }; - return end; -} - -// Text-only queries for composition events - -function textContext(data) { - var range = getSelection().getRangeAt(0); - var start = range.startContainer, - end = range.endContainer; - if (start == end && start.nodeType == 3) { - var value = start.nodeValue, - lead = range.startOffset, - _end = range.endOffset; - if (data && _end >= data.length && value.slice(_end - data.length, _end) == data) lead = _end - data.length; - return { inside: start, lead: lead, trail: value.length - _end }; - } - - var sizeBefore = null, - sizeAfter = null; - var before = start.childNodes[range.startOffset - 1] || nodeBefore(start); - while (before.lastChild) before = before.lastChild; - if (before && before.nodeType == 3) { - var value = before.nodeValue; - sizeBefore = value.length; - if (data && value.slice(value.length - data.length) == data) sizeBefore -= data.length; - } - var after = end.childNodes[range.endOffset] || nodeAfter(end); - while (after.firstChild) after = after.firstChild; - if (after && after.nodeType == 3) sizeAfter = after.nodeValue.length; - - return { before: before, sizeBefore: sizeBefore, - after: after, sizeAfter: sizeAfter }; -} - -function textInContext(context, deflt) { - if (context.inside) { - var _val = context.inside.nodeValue; - return _val.slice(context.lead, _val.length - context.trail); - } else { - var before = context.before, - after = context.after, - val = ""; - if (!before) return deflt; - if (before.nodeType == 3) val = before.nodeValue.slice(context.sizeBefore); - var scan = scanText(before, after); - if (scan == null) return deflt; - val += scan; - if (after && after.nodeType == 3) { - var valAfter = after.nodeValue; - val += valAfter.slice(0, valAfter.length - context.sizeAfter); - } - return val; - } -} - -function nodeAfter(node) { - for (;;) { - var next = node.nextSibling; - if (next) { - while (next.firstChild) next = next.firstChild; - return next; - } - if (!(node = node.parentElement)) return null; - } -} - -function nodeBefore(node) { - for (;;) { - var prev = node.previousSibling; - if (prev) { - while (prev.lastChild) prev = prev.lastChild; - return prev; - } - if (!(node = node.parentElement)) return null; - } -} - -function scanText(start, end) { - var text = "", - cur = nodeAfter(start); - for (;;) { - if (cur == end) return text; - if (!cur) return null; - if (cur.nodeType == 3) text += cur.nodeValue; - cur = cur.firstChild || nodeAfter(cur); - } -} - -},{"../model":27,"../parse/dom":32,"../transform/tree":47,"./selection":15}],7:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.draw = draw; -exports.redraw = redraw; - -var _model = require("../model"); - -var _serializeDom = require("../serialize/dom"); - -var _dom = require("../dom"); - -var _main = require("./main"); - -// FIXME clean up threading of path and offset, maybe remove from DOM renderer entirely - -function options(path, ranges) { - return { - onRender: function onRender(node, dom, offset) { - if (!node.isText && node.type.contains == null) { - dom.contentEditable = false; - if (node.isBlock) dom.setAttribute("pm-leaf", "true"); - } - if (node.isBlock && offset != null) dom.setAttribute("pm-offset", offset); - if (node.isTextblock) adjustTrailingHacks(dom, node); - - return dom; - }, - renderInlineFlat: function renderInlineFlat(node, dom, offset) { - ranges.advanceTo(new _model.Pos(path, offset)); - var end = new _model.Pos(path, offset + node.width); - var nextCut = ranges.nextChangeBefore(end); - - var inner = dom, - wrapped = undefined; - for (var i = 0; i < node.marks.length; i++) { - inner = inner.firstChild; - }if (dom.nodeType != 1) { - dom = (0, _dom.elt)("span", null, dom); - if (!nextCut) wrapped = dom; - } - if (!wrapped && (nextCut || ranges.current.length)) { - wrapped = inner == dom ? dom = (0, _dom.elt)("span", null, inner) : inner.parentNode.appendChild((0, _dom.elt)("span", null, inner)); - } - - dom.setAttribute("pm-offset", offset); - if (node.type.contains == null) dom.setAttribute("pm-leaf", node.isText ? node.width : "true"); - - var inlineOffset = 0; - while (nextCut) { - var size = nextCut - offset; - var split = splitSpan(wrapped, size); - if (ranges.current.length) split.className = ranges.current.join(" "); - split.setAttribute("pm-inner-offset", inlineOffset); - inlineOffset += size; - offset += size; - ranges.advanceTo(new _model.Pos(path, offset)); - if (!(nextCut = ranges.nextChangeBefore(end))) wrapped.setAttribute("pm-inner-offset", inlineOffset); - } - - if (ranges.current.length) wrapped.className = ranges.current.join(" "); - return dom; - }, - document: document, path: path - }; -} - -function splitSpan(span, at) { - var textNode = span.firstChild, - text = textNode.nodeValue; - var newNode = span.parentNode.insertBefore((0, _dom.elt)("span", null, text.slice(0, at)), span); - textNode.nodeValue = text.slice(at); - return newNode; -} - -function draw(pm, doc) { - pm.content.textContent = ""; - pm.content.appendChild((0, _serializeDom.toDOM)(doc, options([], pm.ranges.activeRangeTracker()))); -} - -function adjustTrailingHacks(dom, node) { - var needs = node.size == 0 || node.lastChild.type.isBR ? "br" : !node.lastChild.isText && node.lastChild.type.contains == null ? "text" : null; - var last = dom.lastChild; - var has = !last || last.nodeType != 1 || !last.hasAttribute("pm-ignore") ? null : last.nodeName == "BR" ? "br" : "text"; - if (needs != has) { - if (has) dom.removeChild(last); - if (needs) dom.appendChild(needs == "br" ? (0, _dom.elt)("br", { "pm-ignore": "trailing-break" }) : (0, _dom.elt)("span", { "pm-ignore": "cursor-text" }, "")); - } -} - -function findNodeIn(iter, node) { - var copy = iter.copy(); - for (var child = undefined; child = copy.next().value;) { - if (child == node) return child; - } -} - -function movePast(dom) { - var next = dom.nextSibling; - dom.parentNode.removeChild(dom); - return next; -} - -function redraw(pm, dirty, doc, prev) { - var opts = options([], pm.ranges.activeRangeTracker()); - - function scan(dom, node, prev) { - var iNode = node.iter(), - iPrev = prev.iter(), - pChild = iPrev.next().value; - var domPos = dom.firstChild; - - for (var child = undefined; child = iNode.next().value;) { - var offset = iNode.offset - child.width, - matching = undefined, - reuseDOM = undefined; - if (!node.isTextblock) opts.path.push(offset); - - if (pChild == child) { - matching = pChild; - } else if (matching = findNodeIn(iPrev, child)) { - while (pChild != matching) { - pChild = iPrev.next().value; - domPos = movePast(domPos); - } - } - - if (matching && !dirty.get(matching)) { - reuseDOM = true; - } else if (pChild && !child.isText && child.sameMarkup(pChild) && dirty.get(pChild) != _main.DIRTY_REDRAW) { - reuseDOM = true; - var contentNode = domPos; - for (;;) { - var first = contentNode.firstChild; - if (!first || !first.hasAttribute || first.hasAttribute("pm-ignore") || first.hasAttribute("pm-offset")) break; - contentNode = first; - } - scan(contentNode, child, pChild); - } else { - var rendered = (0, _serializeDom.renderNodeToDOM)(child, opts, offset); - dom.insertBefore(rendered, domPos); - reuseDOM = false; - } - - if (reuseDOM) { - domPos.setAttribute("pm-offset", offset); - domPos = domPos.nextSibling; - pChild = iPrev.next().value; - } - if (!node.isTextblock) opts.path.pop(); - } - - while (pChild) { - domPos = movePast(domPos); - pChild = iPrev.next().value; - } - if (node.isTextblock) adjustTrailingHacks(dom, node); - } - scan(pm.content, doc, prev); -} - -},{"../dom":1,"../model":27,"../serialize/dom":35,"./main":12}],8:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = (function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); - } - }return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; - }; -})(); - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -var _model = require("../model"); - -var _transform = require("../transform"); - -var InvertedStep = function InvertedStep(step, version, id) { - _classCallCheck(this, InvertedStep); - - this.step = step; - this.version = version; - this.id = id; -}; - -var BranchRemapping = (function () { - function BranchRemapping(branch) { - _classCallCheck(this, BranchRemapping); - - this.branch = branch; - this.remap = new _transform.Remapping(); - this.version = branch.version; - this.mirrorBuffer = Object.create(null); - } - - _createClass(BranchRemapping, [{ - key: "moveToVersion", - value: function moveToVersion(version) { - while (this.version > version) this.addNextMap(); - } - }, { - key: "addNextMap", - value: function addNextMap() { - var found = this.branch.mirror[this.version]; - var mapOffset = this.branch.maps.length - (this.branch.version - this.version) - 1; - var id = this.remap.addToFront(this.branch.maps[mapOffset], this.mirrorBuffer[this.version]); - --this.version; - if (found != null) this.mirrorBuffer[found] = id; - return id; - } - }, { - key: "movePastStep", - value: function movePastStep(result) { - var id = this.addNextMap(); - if (result) this.remap.addToBack(result.map, id); - } - }]); - - return BranchRemapping; -})(); - -var workTime = 100, - pauseTime = 150; - -var CompressionWorker = (function () { - function CompressionWorker(doc, branch, callback) { - _classCallCheck(this, CompressionWorker); - - this.branch = branch; - this.callback = callback; - this.remap = new BranchRemapping(branch); - - this.doc = doc; - this.events = []; - this.maps = []; - this.version = this.startVersion = branch.version; - - this.i = branch.events.length; - this.timeout = null; - this.aborted = false; - } - - _createClass(CompressionWorker, [{ - key: "work", - value: function work() { - var _this = this; - - if (this.aborted) return; - - var endTime = Date.now() + workTime; - - for (;;) { - if (this.i == 0) return this.finish(); - var _event = this.branch.events[--this.i], - outEvent = []; - for (var j = _event.length - 1; j >= 0; j--) { - var _event$j = _event[j]; - var step = _event$j.step; - var stepVersion = _event$j.version; - var stepID = _event$j.id; - - this.remap.moveToVersion(stepVersion); - - var mappedStep = step.map(this.remap.remap); - if (mappedStep && isDelStep(step)) { - var extra = 0, - start = step.from; - while (j > 0) { - var next = _event[j - 1]; - if (next.version != stepVersion - 1 || !isDelStep(next.step) || start.cmp(next.step.to)) break; - extra += next.step.to.offset - next.step.from.offset; - start = next.step.from; - stepVersion--; - j--; - this.remap.addNextMap(); - } - if (extra > 0) { - var _start = mappedStep.from.move(-extra); - mappedStep = new _transform.Step("replace", _start, mappedStep.to, _start); - } - } - var result = mappedStep && mappedStep.apply(this.doc); - if (result) { - this.doc = result.doc; - this.maps.push(result.map.invert()); - outEvent.push(new InvertedStep(mappedStep, this.version, stepID)); - this.version--; - } - this.remap.movePastStep(result); - } - if (outEvent.length) { - outEvent.reverse(); - this.events.push(outEvent); - } - if (Date.now() > endTime) { - this.timeout = window.setTimeout(function () { - return _this.work(); - }, pauseTime); - return; - } - } - } - }, { - key: "finish", - value: function finish() { - if (this.aborted) return; - - this.events.reverse(); - this.maps.reverse(); - this.callback(this.maps.concat(this.branch.maps.slice(this.branch.maps.length - (this.branch.version - this.startVersion))), this.events); - } - }, { - key: "abort", - value: function abort() { - this.aborted = true; - window.clearTimeout(this.timeout); - } - }]); - - return CompressionWorker; -})(); - -function isDelStep(step) { - return step.type == "replace" && step.from.offset < step.to.offset && _model.Pos.samePath(step.from.path, step.to.path) && (!step.param || step.param.content.size == 0); -} - -var compressStepCount = 150; - -var Branch = (function () { - function Branch(maxDepth) { - _classCallCheck(this, Branch); - - this.maxDepth = maxDepth; - this.version = 0; - this.nextStepID = 1; - - this.maps = []; - this.mirror = Object.create(null); - this.events = []; - - this.stepsSinceCompress = 0; - this.compressing = null; - this.compressTimeout = null; - } - - _createClass(Branch, [{ - key: "clear", - value: function clear(force) { - if (force || !this.empty()) { - this.maps.length = this.events.length = this.stepsSinceCompress = 0; - this.mirror = Object.create(null); - this.abortCompression(); - } - } - }, { - key: "newEvent", - value: function newEvent() { - this.abortCompression(); - this.events.push([]); - while (this.events.length > this.maxDepth) this.events.shift(); - } - }, { - key: "addMap", - value: function addMap(map) { - if (!this.empty()) { - this.maps.push(map); - this.version++; - this.stepsSinceCompress++; - return true; - } - } - }, { - key: "empty", - value: function empty() { - return this.events.length == 0; - } - }, { - key: "addStep", - value: function addStep(step, map, id) { - this.addMap(map); - if (id == null) id = this.nextStepID++; - this.events[this.events.length - 1].push(new InvertedStep(step, this.version, id)); - } - }, { - key: "addTransform", - value: function addTransform(transform, ids) { - this.abortCompression(); - for (var i = 0; i < transform.steps.length; i++) { - var inverted = transform.steps[i].invert(transform.docs[i], transform.maps[i]); - this.addStep(inverted, transform.maps[i], ids && ids[i]); - } - } - }, { - key: "popEvent", - value: function popEvent(doc, allowCollapsing) { - this.abortCompression(); - var event = this.events.pop(); - if (!event) return null; - - var remap = new BranchRemapping(this), - collapsing = allowCollapsing; - var tr = new _transform.Transform(doc); - var ids = []; - - for (var i = event.length - 1; i >= 0; i--) { - var invertedStep = event[i], - step = invertedStep.step; - if (!collapsing || invertedStep.version != remap.version) { - collapsing = false; - remap.moveToVersion(invertedStep.version); - - step = step.map(remap.remap); - var result = step && tr.step(step); - if (result) { - ids.push(invertedStep.id); - if (this.addMap(result.map)) this.mirror[this.version] = invertedStep.version; - } - - if (i > 0) remap.movePastStep(result); - } else { - this.version--; - delete this.mirror[this.version]; - this.maps.pop(); - tr.step(step); - ids.push(invertedStep.id); - --remap.version; - } - } - if (this.empty()) this.clear(true); - return { transform: tr, ids: ids }; - } - }, { - key: "getVersion", - value: function getVersion() { - return { id: this.nextStepID, version: this.version }; - } - }, { - key: "findVersion", - value: function findVersion(version) { - for (var i = this.events.length - 1; i >= 0; i--) { - var _event2 = this.events[i]; - for (var j = _event2.length - 1; j >= 0; j--) { - var step = _event2[j]; - if (step.id == version.id) return { event: i, step: j };else if (step.id < version.id) return { event: i, step: j + 1 }; - } - } - } - }, { - key: "rebased", - value: function rebased(newMaps, rebasedTransform, positions) { - if (this.empty()) return; - this.abortCompression(); - - var startVersion = this.version - positions.length; - - // Update and clean up the events - out: for (var i = this.events.length - 1; i >= 0; i--) { - var _event3 = this.events[i]; - for (var j = _event3.length - 1; j >= 0; j--) { - var step = _event3[j]; - if (step.version <= startVersion) break out; - var off = positions[step.version - startVersion - 1]; - if (off == -1) { - _event3.splice(j--, 1); - } else { - var inv = rebasedTransform.steps[off].invert(rebasedTransform.docs[off], rebasedTransform.maps[off]); - _event3[j] = new InvertedStep(inv, startVersion + newMaps.length + off + 1, step.id); - } - } - } - - // Sync the array of maps - if (this.maps.length > positions.length) this.maps = this.maps.slice(0, this.maps.length - positions.length).concat(newMaps).concat(rebasedTransform.maps);else this.maps = rebasedTransform.maps.slice(); - - this.version = startVersion + newMaps.length + rebasedTransform.maps.length; - - this.stepsSinceCompress += newMaps.length + rebasedTransform.steps.length - positions.length; - } - }, { - key: "abortCompression", - value: function abortCompression() { - if (this.compressing) { - this.compressing.abort(); - this.compressing = null; - } - } - }, { - key: "needsCompression", - value: function needsCompression() { - return this.stepsSinceCompress > compressStepCount && !this.compressing; - } - }, { - key: "startCompression", - value: function startCompression(doc) { - var _this2 = this; - - this.compressing = new CompressionWorker(doc, this, function (maps, events) { - _this2.maps = maps; - _this2.events = events; - _this2.mirror = Object.create(null); - _this2.compressing = null; - _this2.stepsSinceCompress = 0; - }); - this.compressing.work(); - } - }]); - - return Branch; -})(); - -var compressDelay = 750; - -var History = (function () { - function History(pm) { - var _this3 = this; - - _classCallCheck(this, History); - - this.pm = pm; - - this.done = new Branch(pm.options.historyDepth); - this.undone = new Branch(pm.options.historyDepth); - - this.lastAddedAt = 0; - this.ignoreTransform = false; - - this.allowCollapsing = true; - - pm.on("transform", function (transform, options) { - return _this3.recordTransform(transform, options); - }); - } - - _createClass(History, [{ - key: "recordTransform", - value: function recordTransform(transform, options) { - if (this.ignoreTransform) return; - - if (options.addToHistory == false) { - for (var i = 0; i < transform.maps.length; i++) { - var map = transform.maps[i]; - this.done.addMap(map); - this.undone.addMap(map); - } - } else { - this.undone.clear(); - var now = Date.now(); - if (now > this.lastAddedAt + this.pm.options.historyEventDelay) this.done.newEvent(); - - this.done.addTransform(transform); - this.lastAddedAt = now; - } - this.maybeScheduleCompression(); - } - }, { - key: "undo", - value: function undo() { - return this.shift(this.done, this.undone); - } - }, { - key: "redo", - value: function redo() { - return this.shift(this.undone, this.done); - } - }, { - key: "canUndo", - value: function canUndo() { - return this.done.events.length > 0; - } - }, { - key: "canRedo", - value: function canRedo() { - return this.undone.events.length > 0; - } - }, { - key: "shift", - value: function shift(from, to) { - var event = from.popEvent(this.pm.doc, this.allowCollapsing); - if (!event) return false; - var transform = event.transform; - var ids = event.ids; - - this.ignoreTransform = true; - this.pm.apply(transform); - this.ignoreTransform = false; - - if (!transform.steps.length) return this.shift(from, to); - - if (to) { - to.newEvent(); - to.addTransform(transform, ids); - } - this.lastAddedAt = 0; - - return true; - } - }, { - key: "getVersion", - value: function getVersion() { - return this.done.getVersion(); - } - }, { - key: "backToVersion", - value: function backToVersion(version) { - var found = this.done.findVersion(version); - if (!found) return false; - var event = this.done.events[found.event]; - var combined = this.done.events.slice(found.event + 1).reduce(function (comb, arr) { - return comb.concat(arr); - }, event.slice(found.step)); - this.done.events.length = found.event + ((event.length = found.step) ? 1 : 0); - this.done.events.push(combined); - - this.shift(this.done); - } - }, { - key: "rebased", - value: function rebased(newMaps, rebasedTransform, positions) { - this.done.rebased(newMaps, rebasedTransform, positions); - this.undone.rebased(newMaps, rebasedTransform, positions); - this.maybeScheduleCompression(); - } - }, { - key: "maybeScheduleCompression", - value: function maybeScheduleCompression() { - this.maybeScheduleCompressionForBranch(this.done); - this.maybeScheduleCompressionForBranch(this.undone); - } - }, { - key: "maybeScheduleCompressionForBranch", - value: function maybeScheduleCompressionForBranch(branch) { - var _this4 = this; - - window.clearTimeout(branch.compressTimeout); - if (branch.needsCompression()) branch.compressTimeout = window.setTimeout(function () { - if (branch.needsCompression()) branch.startCompression(_this4.pm.doc); - }, compressDelay); - } - }]); - - return History; -})(); - -exports.History = History; - -},{"../model":27,"../transform":39}],9:[function(require,module,exports){ -// !! This module implements the ProseMirror editor. It contains -// functionality related to editing, selection, and integration with -// the browser. `ProseMirror` is the class you'll want to instantiate -// and interact with when using the editor. - -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _main = require("./main"); - -Object.defineProperty(exports, "ProseMirror", { - enumerable: true, - get: function get() { - return _main.ProseMirror; - } -}); - -var _options = require("./options"); - -Object.defineProperty(exports, "defineOption", { - enumerable: true, - get: function get() { - return _options.defineOption; - } -}); -Object.defineProperty(exports, "Registry", { - enumerable: true, - get: function get() { - return _options.Registry; - } -}); -Object.defineProperty(exports, "defaultRegistry", { - enumerable: true, - get: function get() { - return _options.defaultRegistry; - } -}); - -var _selection = require("./selection"); - -Object.defineProperty(exports, "Range", { - enumerable: true, - get: function get() { - return _selection.Range; - } -}); - -var _keys = require("./keys"); - -Object.defineProperty(exports, "Keymap", { - enumerable: true, - get: function get() { - return _keys.Keymap; - } -}); -Object.defineProperty(exports, "keyName", { - enumerable: true, - get: function get() { - return _keys.keyName; - } -}); -Object.defineProperty(exports, "keyNames", { - enumerable: true, - get: function get() { - return _keys.keyNames; - } -}); - -var _range = require("./range"); - -Object.defineProperty(exports, "MarkedRange", { - enumerable: true, - get: function get() { - return _range.MarkedRange; - } -}); - -var _commands = require("./commands"); - -Object.defineProperty(exports, "defineCommand", { - enumerable: true, - get: function get() { - return _commands.defineCommand; - } -}); -Object.defineProperty(exports, "defineParamHandler", { - enumerable: true, - get: function get() { - return _commands.defineParamHandler; - } -}); -Object.defineProperty(exports, "Command", { - enumerable: true, - get: function get() { - return _commands.Command; - } -}); - -},{"./commands":4,"./keys":11,"./main":12,"./options":13,"./range":14,"./selection":15}],10:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = (function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); - } - }return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; - }; -})(); - -exports.dispatchKey = dispatchKey; - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -var _model = require("../model"); - -var _parseDom = require("../parse/dom"); - -var _parseText = require("../parse/text"); - -var _dom = require("../dom"); - -var _serializeDom = require("../serialize/dom"); - -var _serializeText = require("../serialize/text"); - -var _parse = require("../parse"); - -var _keys = require("./keys"); - -var _capturekeys = require("./capturekeys"); - -var _domchange = require("./domchange"); - -var _selection = require("./selection"); - -var stopSeq = null; - -/** - * A collection of DOM events that occur within the editor, and callback functions - * to invoke when the event fires. - */ -var handlers = {}; - -var Input = (function () { - function Input(pm) { - var _this = this; - - _classCallCheck(this, Input); - - this.pm = pm; - - this.keySeq = null; - - // When the user is creating a composed character, - // this is set to a Composing instance. - this.composing = null; - this.shiftKey = this.updatingComposition = false; - this.skipInput = 0; - - this.draggingFrom = false; - - this.keymaps = []; - this.defaultKeymap = null; - - this.storedMarks = null; - - this.dropTarget = pm.wrapper.appendChild((0, _dom.elt)("div", { "class": "ProseMirror-drop-target" })); - - var _loop = function _loop(_event) { - var handler = handlers[_event]; - pm.content.addEventListener(_event, function (e) { - return handler(pm, e); - }); - }; - - for (var _event in handlers) { - _loop(_event); - } - - pm.on("selectionChange", function () { - return _this.storedMarks = null; - }); - } - - /** - * Dispatch a key press to the internal keymaps, which will override the default - * DOM behavior. - * - * @param {ProseMirror} pm The editor instance. - * @param {string} name The name of the key pressed. - * @param {KeyboardEvent} e - * @return {string} If the key name has a mapping and the callback is invoked ("handled"), - * if the key name needs to be combined in sequence with the next key ("multi"), - * if there is no mapping ("nothing"). - */ - - _createClass(Input, [{ - key: "maybeAbortComposition", - value: function maybeAbortComposition() { - if (this.composing && !this.updatingComposition) { - if (this.composing.finished) { - finishComposing(this.pm); - } else { - // Toggle selection to force end of composition - this.composing = null; - this.skipInput++; - var sel = getSelection(); - if (sel.rangeCount) { - var range = sel.getRangeAt(0); - sel.removeAllRanges(); - sel.addRange(range); - } - } - return true; - } - } - }]); - - return Input; -})(); - -exports.Input = Input; - -function dispatchKey(pm, name, e) { - var seq = pm.input.keySeq; - // If the previous key should be used in sequence with this one, modify the name accordingly. - if (seq) { - if ((0, _keys.isModifierKey)(name)) return true; - clearTimeout(stopSeq); - stopSeq = setTimeout(function () { - if (pm.input.keySeq == seq) pm.input.keySeq = null; - }, 50); - name = seq + " " + name; - } - - var handle = function handle(bound) { - if (bound === false) return "nothing"; - if (bound == "...") return "multi"; - if (bound == null) return false; - - var result = false; - if (Array.isArray(bound)) { - for (var i = 0; result === false && i < bound.length; i++) { - result = handle(bound[i]); - } - } else if (typeof bound == "string") { - result = pm.execCommand(bound); - } else { - result = bound(pm); - } - return result == false ? false : "handled"; - }; - - var result = undefined; - for (var i = 0; !result && i < pm.input.keymaps.length; i++) { - result = handle(pm.input.keymaps[i].map.lookup(name, pm)); - }if (!result) result = handle(pm.baseKeymap.lookup(name, pm)) || handle(_capturekeys.captureKeys.lookup(name)); - - // If the key should be used in sequence with the next key, store the keyname internally. - if (result == "multi") pm.input.keySeq = name; - - if (result == "handled" || result == "multi") e.preventDefault(); - - if (seq && !result && /\'$/.test(name)) { - e.preventDefault(); - return true; - } - return !!result; -} - -handlers.keydown = function (pm, e) { - if (e.keyCode == 16) pm.input.shiftKey = true; - if (pm.input.composing) return; - var name = (0, _keys.keyName)(e); - if (name && dispatchKey(pm, name, e)) return; - pm.sel.pollForUpdate(); -}; - -handlers.keyup = function (pm, e) { - if (e.keyCode == 16) pm.input.shiftKey = false; -}; - -function inputText(pm, range, text) { - if (range.empty && !text) return false; - var marks = pm.input.storedMarks || pm.doc.marksAt(range.from); - var tr = pm.tr; - tr.replaceWith(range.from, range.to, pm.schema.text(text, marks)).apply(); - pm.scrollIntoView(); - // :: () #path=ProseMirror#events#textInput - // Fired when the user types text into the editor. - pm.signal("textInput", text); -} - -handlers.keypress = function (pm, e) { - if (pm.input.composing || !e.charCode || e.ctrlKey && !e.altKey || _dom.browser.mac && e.metaKey) return; - var ch = String.fromCharCode(e.charCode); - if (dispatchKey(pm, "'" + ch + "'", e)) return; - var sel = pm.selection; - if (sel.node && sel.node.contains == null) { - pm.tr["delete"](sel.from, sel.to).apply(); - sel = pm.selection; - } - inputText(pm, sel, ch); - e.preventDefault(); -}; - -function selectClickedNode(pm, e) { - var pos = (0, _selection.selectableNodeAbove)(pm, e.target, { left: e.clientX, top: e.clientY }, true); - if (!pos) return pm.sel.pollForUpdate(); - - var _pm$selection = pm.selection; - var node = _pm$selection.node; - var from = _pm$selection.from; - - if (node && pos.depth >= from.depth && pos.shorten(from.depth).cmp(from) == 0) { - if (from.depth == 0) return pm.sel.pollForUpdate(); - pos = from.shorten(); - } - - pm.setNodeSelection(pos); - pm.focus(); - e.preventDefault(); -} - -var lastClick = 0; - -handlers.mousedown = function (pm, e) { - if (e.ctrlKey) return selectClickedNode(pm, e); - - pm.sel.pollForUpdate(); - - var now = Date.now(), - multi = now - lastClick < 500; - lastClick = now; - if (pm.input.shiftKey || multi) return; - - var x = e.clientX, - y = e.clientY, - moved = false; - var up = function up() { - removeEventListener("mouseup", up); - removeEventListener("mousemove", move); - if ((0, _selection.handleNodeClick)(pm, e)) return; - - var pos = !moved && (0, _selection.selectableNodeAbove)(pm, e.target, { left: e.clientX, top: e.clientY }); - if (pos) { - pm.setNodeSelection(pos); - pm.focus(); - } else { - pm.sel.pollForUpdate(); - } - }; - var move = function move(e) { - if (!moved && (Math.abs(x - e.clientX) > 4 || Math.abs(y - e.clientY) > 4)) moved = true; - pm.sel.pollForUpdate(); - }; - addEventListener("mouseup", up); - addEventListener("mousemove", move); -}; - -handlers.touchdown = function (pm) { - pm.sel.pollForUpdate(); -}; - -/** - * A class to track state while creating a composed character. - */ - -var Composing = function Composing(pm, data) { - _classCallCheck(this, Composing); - - this.finished = false; - this.context = (0, _domchange.textContext)(data); - this.data = data; - this.endData = null; - var range = pm.selection; - if (data) { - var path = range.head.path, - line = pm.doc.path(path).textContent; - var found = line.indexOf(data, range.head.offset - data.length); - if (found > -1 && found <= range.head.offset + data.length) range = new _selection.TextSelection(new _model.Pos(path, found), new _model.Pos(path, found + data.length)); - } - this.range = range; -}; - -handlers.compositionstart = function (pm, e) { - if (pm.input.maybeAbortComposition()) return; - - pm.flush(); - pm.input.composing = new Composing(pm, e.data); - var above = pm.selection.head.shorten(); - pm.markRangeDirty({ from: above, to: above.move(1) }); -}; - -handlers.compositionupdate = function (pm, e) { - var info = pm.input.composing; - if (info && info.data != e.data) { - info.data = e.data; - pm.input.updatingComposition = true; - inputText(pm, info.range, info.data); - pm.input.updatingComposition = false; - info.range = new _selection.TextSelection(info.range.from, info.range.from.move(info.data.length)); - } -}; - -handlers.compositionend = function (pm, e) { - var info = pm.input.composing; - if (info) { - pm.input.composing.finished = true; - pm.input.composing.endData = e.data; - setTimeout(function () { - if (pm.input.composing == info) finishComposing(pm); - }, 20); - } -}; - -function finishComposing(pm) { - var info = pm.input.composing; - var text = (0, _domchange.textInContext)(info.context, info.endData); - var range = (0, _selection.rangeFromDOMLoose)(pm); - pm.ensureOperation(); - pm.input.composing = null; - if (text != info.data) inputText(pm, info.range, text); - if (range && !range.eq(pm.sel.range)) pm.setSelectionDirect(range); -} - -handlers.input = function (pm) { - if (pm.input.skipInput) return --pm.input.skipInput; - - if (pm.input.composing) { - if (pm.input.composing.finished) finishComposing(pm); - return; - } - - pm.sel.stopPollingForUpdate(); - (0, _domchange.applyDOMChange)(pm); - pm.scrollIntoView(); -}; - -var lastCopied = null; - -handlers.copy = handlers.cut = function (pm, e) { - var _pm$selection2 = pm.selection; - var from = _pm$selection2.from; - var to = _pm$selection2.to; - var empty = _pm$selection2.empty; - - if (empty) return; - var fragment = pm.selectedDoc; - lastCopied = { doc: pm.doc, from: from, to: to, - html: (0, _serializeDom.toHTML)(fragment), - text: (0, _serializeText.toText)(fragment) }; - - if (e.clipboardData) { - e.preventDefault(); - e.clipboardData.clearData(); - e.clipboardData.setData("text/html", lastCopied.html); - e.clipboardData.setData("text/plain", lastCopied.text); - if (e.type == "cut" && !empty) pm.tr["delete"](from, to).apply(); - } -}; - -handlers.paste = function (pm, e) { - if (!e.clipboardData) return; - var sel = pm.selection; - var txt = e.clipboardData.getData("text/plain"); - var html = e.clipboardData.getData("text/html"); - if (html || txt) { - e.preventDefault(); - var doc = undefined, - from = undefined, - to = undefined; - if (pm.input.shiftKey && txt) { - doc = (0, _parseText.fromText)(pm.schema, txt); - } else if (lastCopied && (lastCopied.html == html || lastCopied.text == txt)) { - ;var _lastCopied = lastCopied; - doc = _lastCopied.doc; - from = _lastCopied.from; - to = _lastCopied.to; - } else if (html) { - doc = (0, _parseDom.fromHTML)(pm.schema, html); - } else { - doc = (0, _parse.parseFrom)(pm.schema, txt, (0, _parse.knownSource)("markdown") ? "markdown" : "text"); - } - pm.tr.replace(sel.from, sel.to, doc, from || (0, _selection.findSelectionAtStart)(doc).from, to || (0, _selection.findSelectionAtEnd)(doc).to).apply(); - pm.scrollIntoView(); - } -}; - -handlers.dragstart = function (pm, e) { - if (!e.dataTransfer) return; - - var fragment = pm.selectedDoc; - - e.dataTransfer.setData("text/html", (0, _serializeDom.toHTML)(fragment)); - e.dataTransfer.setData("text/plain", (0, _serializeText.toText)(fragment)); - pm.input.draggingFrom = true; -}; - -handlers.dragend = function (pm) { - return window.setTimeout(function () { - return pm.input.dragginFrom = false; - }, 50); -}; - -handlers.dragover = handlers.dragenter = function (pm, e) { - e.preventDefault(); - var cursorPos = pm.posAtCoords({ left: e.clientX, top: e.clientY }); - if (!cursorPos) return; - var coords = (0, _selection.coordsAtPos)(pm, cursorPos); - var rect = pm.wrapper.getBoundingClientRect(); - coords.top -= rect.top; - coords.right -= rect.left; - coords.bottom -= rect.top; - coords.left -= rect.left; - var target = pm.input.dropTarget; - target.style.display = "block"; - target.style.left = coords.left - 1 + "px"; - target.style.top = coords.top + "px"; - target.style.height = coords.bottom - coords.top + "px"; -}; - -handlers.dragleave = function (pm) { - return pm.input.dropTarget.style.display = ""; -}; - -handlers.drop = function (pm, e) { - pm.input.dropTarget.style.display = ""; - - if (!e.dataTransfer) return; - - var html = undefined, - txt = undefined, - doc = undefined; - if (html = e.dataTransfer.getData("text/html")) doc = (0, _parseDom.fromHTML)(pm.schema, html, { document: document });else if (txt = e.dataTransfer.getData("text/plain")) doc = (0, _parse.parseFrom)(pm.schema, txt, (0, _parse.knownSource)("markdown") ? "markdown" : "text"); - - if (doc) { - e.preventDefault(); - var insertPos = pm.posAtCoords({ left: e.clientX, top: e.clientY }); - if (!insertPos) return; - var tr = pm.tr; - if (pm.input.draggingFrom && !e.ctrlKey) { - tr.deleteSelection(); - insertPos = tr.map(insertPos).pos; - } - tr.replace(insertPos, insertPos, doc, (0, _selection.findSelectionAtStart)(doc).from, (0, _selection.findSelectionAtEnd)(doc).to).apply(); - pm.setTextSelection(insertPos, tr.map(insertPos).pos); - pm.focus(); - } -}; - -handlers.focus = function (pm) { - (0, _dom.addClass)(pm.wrapper, "ProseMirror-focused"); - // :: () #path=ProseMirror#events#focus - // Fired when the editor gains focus. - pm.signal("focus"); -}; - -handlers.blur = function (pm) { - (0, _dom.rmClass)(pm.wrapper, "ProseMirror-focused"); - // :: () #path=ProseMirror#events#blur - // Fired when the editor loses focus. - pm.signal("blur"); -}; - -},{"../dom":1,"../model":27,"../parse":33,"../parse/dom":32,"../parse/text":34,"../serialize/dom":35,"../serialize/text":37,"./capturekeys":2,"./domchange":6,"./keys":11,"./selection":15}],11:[function(require,module,exports){ -// From CodeMirror, should be factored into its own NPM module - -// declare_global: navigator -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = (function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); - } - }return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; - }; -})(); - -exports.keyName = keyName; -exports.isModifierKey = isModifierKey; -exports.normalizeKeyName = normalizeKeyName; - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -var mac = typeof navigator != "undefined" ? /Mac/.test(navigator.platform) : false; - -// :: Object -// A map from key codes to key names. -var keyNames = { - 3: "Enter", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt", - 19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End", - 36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert", - 46: "Delete", 59: ";", 61: "=", 91: "Mod", 92: "Mod", 93: "Mod", - 106: "*", 107: "=", 109: "-", 110: ".", 111: "/", 127: "Delete", - 173: "-", 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\", - 221: "]", 222: "'", 63232: "Up", 63233: "Down", 63234: "Left", 63235: "Right", 63272: "Delete", - 63273: "Home", 63275: "End", 63276: "PageUp", 63277: "PageDown", 63302: "Insert" -}; - -exports.keyNames = keyNames; -// Number keys -for (var i = 0; i < 10; i++) { - keyNames[i + 48] = keyNames[i + 96] = String(i); -} // Alphabetic keys -for (var i = 65; i <= 90; i++) { - keyNames[i] = String.fromCharCode(i); -} // Function keys -for (var i = 1; i <= 12; i++) { - keyNames[i + 111] = keyNames[i + 63235] = "F" + i; -} // :: (KeyboardEvent) → ?string -// Find a name for the given keydown event. If the keycode in the -// event is not known, this will return `null`. Otherwise, it will -// return a string like `"Shift-Cmd-Ctrl-Alt-Home"`. The parts before -// the dashes give the modifiers (always in that order, if present), -// and the last word gives the key name, which one of the names in -// `keyNames`. -// -// The convention for keypress events is to use the pressed character -// between single quotes. Due to limitations in the browser API, -// keypress events can not have modifiers. - -function keyName(event) { - var base = keyNames[event.keyCode], - name = base; - if (name == null || event.altGraphKey) return null; - - if (event.altKey && base != "Alt") name = "Alt-" + name; - if (event.ctrlKey && base != "Ctrl") name = "Ctrl-" + name; - if (event.metaKey && base != "Cmd") name = "Cmd-" + name; - if (event.shiftKey && base != "Shift") name = "Shift-" + name; - return name; -} - -// :: (string) → bool -// Test whether the given key name refers to a modifier key. - -function isModifierKey(name) { - name = /[^-]*$/.exec(name)[0]; - return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod"; -} - -// :: (string) → string -// Normalize a sloppy key name, which may have modifiers in the wrong -// order or use shorthands for modifiers, to a properly formed key -// name. Used to normalize names provided in keymaps. -// -// Note that the modifier `mod` is a shorthand for `Cmd` on Mac, and -// `Ctrl` on other platforms. - -function normalizeKeyName(name) { - var parts = name.split(/-(?!'?$)/), - result = parts[parts.length - 1]; - var alt = undefined, - ctrl = undefined, - shift = undefined, - cmd = undefined; - for (var i = 0; i < parts.length - 1; i++) { - var mod = parts[i]; - if (/^(cmd|meta|m)$/i.test(mod)) cmd = true;else if (/^a(lt)?$/i.test(mod)) alt = true;else if (/^(c|ctrl|control)$/i.test(mod)) ctrl = true;else if (/^s(hift)$/i.test(mod)) shift = true;else if (/^mod$/i.test(mod)) { - if (mac) cmd = true;else ctrl = true; - } else throw new Error("Unrecognized modifier name: " + mod); - } - if (alt) result = "Alt-" + result; - if (ctrl) result = "Ctrl-" + result; - if (cmd) result = "Cmd-" + result; - if (shift) result = "Shift-" + result; - return result; -} - -// ;; A keymap binds a set of [key names](#keyName) to commands names -// or functions. - -var Keymap = (function () { - // :: (Object, ?Object) - // Construct a keymap using the bindings in `keys`, whose properties - // should be [key names](#keyName) or space-separated sequences of - // key names. In the second case, the binding will be for a - // multi-stroke key combination. - // - // When `options` has a property `call`, this will be a programmatic - // keymap, meaning that instead of looking keys up in its set of - // bindings, it will pass the key name to `options.call`, and use - // the return value of that calls as the resolved binding. - // - // `options.name` can be used to give the keymap a name, making it - // easier to [remove](#ProseMirror.removeKeymap) from an editor. - - function Keymap(keys, options) { - _classCallCheck(this, Keymap); - - this.options = options || {}; - this.bindings = Object.create(null); - if (keys) for (var keyname in keys) { - if (Object.prototype.hasOwnProperty.call(keys, keyname)) this.addBinding(keyname, keys[keyname]); - } - } - - // :: (string, any) - // Add a binding for the given key or key sequence. - - _createClass(Keymap, [{ - key: "addBinding", - value: function addBinding(keyname, value) { - var keys = keyname.split(/ +(?!\'$)/).map(normalizeKeyName); - for (var i = 0; i < keys.length; i++) { - var _name = keys.slice(0, i + 1).join(" "); - var val = i == keys.length - 1 ? value : "..."; - var prev = this.bindings[_name]; - if (!prev) this.bindings[_name] = val;else if (prev != val) throw new Error("Inconsistent bindings for " + _name); - } - } - - // :: (string) - // Remove the binding for the given key or key sequence. - }, { - key: "removeBinding", - value: function removeBinding(keyname) { - var keys = keyname.split(/ +(?!\'$)/).map(normalizeKeyName); - for (var i = keys.length - 1; i >= 0; i--) { - var _name2 = keys.slice(0, i).join(" "); - var val = this.bindings[_name2]; - if (val == "..." && !this.unusedMulti(_name2)) break;else if (val) delete this.bindings[_name2]; - } - } - }, { - key: "unusedMulti", - value: function unusedMulti(name) { - for (var binding in this.bindings) { - if (binding.length > name && binding.indexOf(name) == 0 && binding.charAt(name.length) == " ") return false; - }return true; - } - - // :: (string, ?any) → any - // Looks up the given key or key sequence in this keymap. Returns - // the value the key is bound to (which may be undefined if it is - // not bound), or the string `"..."` if the key is a prefix of a - // multi-key sequence that is bound by this keymap. - }, { - key: "lookup", - value: function lookup(key, context) { - return this.options.call ? this.options.call(key, context) : this.bindings[key]; - } - }]); - - return Keymap; -})(); - -exports.Keymap = Keymap; - -},{}],12:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _get = function get(_x4, _x5, _x6) { - var _again = true;_function: while (_again) { - var object = _x4, - property = _x5, - receiver = _x6;_again = false;if (object === null) object = Function.prototype;var desc = Object.getOwnPropertyDescriptor(object, property);if (desc === undefined) { - var parent = Object.getPrototypeOf(object);if (parent === null) { - return undefined; - } else { - _x4 = parent;_x5 = property;_x6 = receiver;_again = true;desc = parent = undefined;continue _function; - } - } else if ("value" in desc) { - return desc.value; - } else { - var getter = desc.get;if (getter === undefined) { - return undefined; - }return getter.call(receiver); - } - } -}; - -var _createClass = (function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); - } - }return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; - }; -})(); - -function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { "default": obj }; -} - -function _inherits(subClass, superClass) { - if (typeof superClass !== "function" && superClass !== null) { - throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); - }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; -} - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -require("./css"); - -var _model = require("../model"); - -var _transform = require("../transform"); - -var _utilSortedinsert = require("../util/sortedinsert"); - -var _utilSortedinsert2 = _interopRequireDefault(_utilSortedinsert); - -var _utilMap = require("../util/map"); - -var _utilEvent = require("../util/event"); - -var _dom = require("../dom"); - -var _serializeText = require("../serialize/text"); - -require("../parse/text"); - -var _parse = require("../parse"); - -var _serialize = require("../serialize"); - -var _options = require("./options"); - -var _selection2 = require("./selection"); - -var _draw = require("./draw"); - -var _input = require("./input"); - -var _history = require("./history"); - -var _commands = require("./commands"); - -var _range = require("./range"); - -var _keys = require("./keys"); - -// ;; This is the class used to represent instances of the editor. A -// ProseMirror editor holds a [document](#Node) and a -// [selection](#Selection), and displays an editable surface -// representing that document in the browser document. -// -// Contains event methods (`on`, etc) from the [event -// mixin](#EventMixin). - -var ProseMirror = (function () { - // :: (Object) - // Construct a new editor from a set of [options](#edit_options) - // and, if it has a [`place`](#place) option, add it to the - // document. - - function ProseMirror(opts) { - _classCallCheck(this, ProseMirror); - - opts = this.options = (0, _options.parseOptions)(opts); - // :: Schema - // The schema for this editor's document. - this.schema = opts.schema; - if (opts.doc == null) opts.doc = this.schema.node("doc", null, [this.schema.node("paragraph")]); - // :: DOMNode - // The editable DOM node containing the document. - this.content = (0, _dom.elt)("div", { "class": "ProseMirror-content" }); - // :: DOMNode - // The outer DOM element of the editor. - this.wrapper = (0, _dom.elt)("div", { "class": "ProseMirror" }, this.content); - this.wrapper.ProseMirror = this; - - if (opts.place && opts.place.appendChild) opts.place.appendChild(this.wrapper);else if (opts.place) opts.place(this.wrapper); - - this.setDocInner(opts.docFormat ? (0, _parse.parseFrom)(this.schema, opts.doc, opts.docFormat) : opts.doc); - (0, _draw.draw)(this, this.doc); - this.content.contentEditable = true; - if (opts.label) this.content.setAttribute("aria-label", opts.label); - - // :: Object - // A namespace where modules can store references to themselves - // associated with this editor instance. - this.mod = Object.create(null); - this.operation = null; - this.dirtyNodes = new _utilMap.Map(); // Maps node object to 1 (re-scan content) or 2 (redraw entirely) - this.flushScheduled = false; - - this.sel = new _selection2.SelectionState(this); - this.accurateSelection = false; - this.input = new _input.Input(this); - - // :: Object - // The commands available in the editor. - this.commands = (0, _commands.initCommands)(this); - this.commandKeys = Object.create(null); - - (0, _options.initOptions)(this); - } - - // :: (string, any) - // Update the value of the given [option](#edit_options). - - _createClass(ProseMirror, [{ - key: "setOption", - value: function setOption(name, value) { - (0, _options.setOption)(this, name, value); - } - - // :: (string) → any - // Get the current value of the given [option](#edit_options). - }, { - key: "getOption", - value: function getOption(name) { - return this.options[name]; - } - - // :: Selection - // Get the current selection. - }, { - key: "setTextSelection", - - // :: (Pos, ?Pos) - // Set the selection to a [text selection](#TextSelection) from - // `anchor` to `head`, or, if `head` is null, a cursor selection at - // `anchor`. - value: function setTextSelection(anchor, head) { - this.setSelection(new _selection2.TextSelection(anchor, head)); - } - - // :: (Pos) - // Set the selection to a node selection on the node after `pos`. - }, { - key: "setNodeSelection", - value: function setNodeSelection(pos) { - this.checkPos(pos, false); - var parent = this.doc.path(pos.path); - if (pos.offset >= parent.size) throw new Error("Trying to set a node selection at the end of a node"); - var node = parent.child(pos.offset); - if (!node.type.selectable) throw new Error("Trying to select a non-selectable node"); - this.input.maybeAbortComposition(); - this.sel.setAndSignal(new _selection2.NodeSelection(pos, pos.move(1), node)); - } - - // :: (Selection) - // Set the selection to the given selection object. - }, { - key: "setSelection", - value: function setSelection(selection) { - if (selection instanceof _selection2.TextSelection) { - this.checkPos(selection.head, true); - if (!selection.empty) this.checkPos(selection.anchor, true); - } else { - this.checkPos(selection.to, false); - } - this.setSelectionDirect(selection); - } - }, { - key: "setSelectionDirect", - value: function setSelectionDirect(selection) { - this.ensureOperation(); - this.input.maybeAbortComposition(); - if (!selection.eq(this.sel.range)) this.sel.setAndSignal(selection); - } - - // :: (any, ?string) - // Replace the editor's document. When `format` is given, it should - // be a [parsable format](#parse), and `value` should something in - // that format. If not, `value` should be a `Node`. - }, { - key: "setContent", - value: function setContent(value, format) { - if (format) value = (0, _parse.parseFrom)(this.schema, value, format); - this.setDoc(value); - } - - // :: (?string) → any - // Get the editor's content in a given format. When `format` is not - // given, a `Node` is returned. If it is given, it should be an - // existing [serialization format](#serialize). - }, { - key: "getContent", - value: function getContent(format) { - return format ? (0, _serialize.serializeTo)(this.doc, format) : this.doc; - } - }, { - key: "setDocInner", - value: function setDocInner(doc) { - if (doc.type != this.schema.nodes.doc) throw new Error("Trying to set a document with a different schema"); - // :: Node The current document. - this.doc = doc; - this.ranges = new _range.RangeStore(this); - this.history = new _history.History(this); - } - - // :: (Node, ?Selection) - // Set the editor's content, and optionally include a new selection. - }, { - key: "setDoc", - value: function setDoc(doc, sel) { - if (!sel) sel = (0, _selection2.findSelectionAtStart)(doc); - // :: (doc: Node, selection: Selection) #path=ProseMirror#events#beforeSetDoc - // Fired when [`setDoc`](#ProseMirror.setDoc) is called, before - // the document is actually updated. - this.signal("beforeSetDoc", doc, sel); - this.ensureOperation(); - this.setDocInner(doc); - this.sel.set(sel, true); - // :: (doc: Node, selection: Selection) #path=ProseMirror#events#setDoc - // Fired when [`setDoc`](#ProseMirror.setDoc) is called, after - // the document is updated. - this.signal("setDoc", doc, sel); - } - }, { - key: "updateDoc", - value: function updateDoc(doc, mapping, selection) { - this.ensureOperation(); - this.input.maybeAbortComposition(); - this.ranges.transform(mapping); - this.doc = doc; - this.sel.setAndSignal(selection || this.sel.range.map(doc, mapping)); - // :: () #path=ProseMirror#events#change - // Fired when the document has changed. See - // [`setDoc`](#ProseMirror.event_setDoc) and - // [`transform`](#ProseMirror.event_transform) for more specific - // change-related events. - this.signal("change"); - } - - // :: EditorTransform - // Create an editor- and selection-aware `Transform` for this editor. - }, { - key: "apply", - - // :: (Transform, ?Object) → ?Transform - // Apply a transformation (which you might want to create with the - // [`tr` getter](#ProseMirror.tr)) to the document in the editor. - // The following options are supported: - // - // **`selection`**`: ?Selection` - // : A new selection to set after the transformation is applied. - // - // **`scrollIntoView`**: ?bool - // : When true, scroll the selection into view on the next - // [redraw](#ProseMirror.flush). - // - // Returns the transform, or `false` if there were no steps in it. - value: function apply(transform) { - var options = arguments.length <= 1 || arguments[1] === undefined ? nullOptions : arguments[1]; - - if (transform.doc == this.doc) return false; - if (transform.docs[0] != this.doc && (0, _model.findDiffStart)(transform.docs[0], this.doc)) throw new Error("Applying a transform that does not start with the current document"); - - this.updateDoc(transform.doc, transform, options.selection); - // :: (Transform, Object) #path=ProseMirror#events#transform - // Signals that a (non-empty) transformation has been aplied to - // the editor. Passes the `Transform` and the options given to - // [`apply`](#ProseMirror.apply) as arguments to the handler. - this.signal("transform", transform, options); - if (options.scrollIntoView) this.scrollIntoView(); - return transform; - } - - // :: (Pos, ?bool) - // Verify that the given position is valid in the current document, - // and throw an error otherwise. When `textblock` is true, the position - // must also fall within a textblock node. - }, { - key: "checkPos", - value: function checkPos(pos, textblock) { - if (!this.doc.isValidPos(pos, textblock)) throw new Error("Position " + pos + " is not valid in current document"); - } - }, { - key: "ensureOperation", - value: function ensureOperation() { - return this.operation || this.startOperation(); - } - }, { - key: "startOperation", - value: function startOperation() { - var _this = this; - - this.sel.beforeStartOp(); - this.operation = new Operation(this); - if (!this.flushScheduled) { - (0, _dom.requestAnimationFrame)(function () { - _this.flushScheduled = false; - _this.flush(); - }); - this.flushScheduled = true; - } - return this.operation; - } - - // :: () - // Flush any pending changes to the DOM. When the document, - // selection, or marked ranges in an editor change, the DOM isn't - // updated immediately, but rather scheduled to be updated the next - // time the browser redraws the screen. This method can be used to - // force this to happen immediately. It can be useful when you, for - // example, want to measure where on the screen a part of the - // document ends up, immediately after changing the document. - }, { - key: "flush", - value: function flush() { - if (!document.body.contains(this.wrapper) || !this.operation) return; - // :: () #path=ProseMirror#events#flushing - // Fired when the editor is about to [flush](#ProseMirror.flush) - // an update to the DOM. - this.signal("flushing"); - var op = this.operation; - if (!op) return; - this.operation = null; - this.accurateSelection = true; - - var docChanged = op.doc != this.doc || this.dirtyNodes.size, - redrawn = false; - if (!this.input.composing && (docChanged || op.composingAtStart)) { - (0, _draw.redraw)(this, this.dirtyNodes, this.doc, op.doc); - this.dirtyNodes.clear(); - redrawn = true; - } - - if ((redrawn || !op.sel.eq(this.sel.range)) && !this.input.composing) this.sel.toDOM(op.focus); - - if (op.scrollIntoView !== false) (0, _selection2.scrollIntoView)(this, op.scrollIntoView); - // :: () #path=ProseMirror#events#draw - // Fired when the editor redrew its document in the DOM. - if (docChanged) this.signal("draw"); - // :: () #path=ProseMirror#events#flush - // Fired when the editor has finished - // [flushing](#ProseMirror.flush) an update to the DOM. If you - // need to respond to this with a DOM update of your own, use this - // event to read layout from the DOM, and - // [`flushed`](#ProseMirror.event_flushed) to update the DOM. - this.signal("flush"); - // :: () #path=ProseMirror#events#flushed - // Fired when the editor has finished - // [flushing](#ProseMirror.flush) an update to the DOM, after - // [`flush`](#ProseMirror.event_flush) has fired. - this.signal("flushed"); - this.accurateSelection = false; - } - - // :: (Keymap, ?number) - // Add a [keymap](#Keymap) to the editor. Keymaps added in this way - // are queried before the [base keymap](#keymap). - // The `rank` parameter can be used to control when they are queried - // relative to other maps added like this. Maps with a lower rank - // get queried first. - }, { - key: "addKeymap", - value: function addKeymap(map) { - var rank = arguments.length <= 1 || arguments[1] === undefined ? 50 : arguments[1]; - - (0, _utilSortedinsert2["default"])(this.input.keymaps, { map: map, rank: rank }, function (a, b) { - return a.rank - b.rank; - }); - } - - // :: (union) - // Remove the given keymap, or the keymap with the given name, from - // the editor. - }, { - key: "removeKeymap", - value: function removeKeymap(map) { - var maps = this.input.keymaps; - for (var i = 0; i < maps.length; ++i) { - if (maps[i].map == map || maps[i].map.options.name == map) { - maps.splice(i, 1); - return true; - } - } - } - }, { - key: "markRange", - - // :: (Pos, Pos, ?Object) → MarkedRange - // Create a marked range between the given positions. Marked ranges - // “track” the part of the document they point to—as the document - // changes, they are updated to move, grow, and shrink along with - // their content. - // - // `options` may be an object containing these properties: - // - // **`inclusiveLeft`**`: bool = false` - // : Whether the left side of the range is inclusive. When it is, - // content inserted at that point will become part of the range. - // When not, it will be outside of the range. - // - // **`inclusiveRight`**`: bool = false` - // : Whether the right side of the range is inclusive. - // - // **`removeWhenEmpty`**`: bool = true` - // : Whether the range should be forgotten when it becomes empty - // (because all of its content was deleted). - // - // **`className`**: string - // : A CSS class to add to the inline content that is part of this - // range. - value: function markRange(from, to, options) { - this.checkPos(from); - this.checkPos(to); - var range = new _range.MarkedRange(from, to, options); - this.ranges.addRange(range); - return range; - } - - // :: (MarkedRange) - // Remove the given range from the editor. - }, { - key: "removeRange", - value: function removeRange(range) { - this.ranges.removeRange(range); - } - - // :: (MarkType, ?bool, ?Object) - // Set (when `to` is true), unset (`to` is false), or toggle (`to` - // is null) the given mark type on the selection. When there is a - // non-empty selection, the marks of the selection are updated. When - // the selection is empty, the set of [active - // marks](#ProseMirror.activeMarks) is updated. - }, { - key: "setMark", - value: function setMark(type, to, attrs) { - var sel = this.selection; - if (sel.empty) { - var marks = this.activeMarks(); - if (to == null) to = !type.isInSet(marks); - if (to && !this.doc.path(sel.head.path).type.canContainMark(type)) return; - this.input.storedMarks = to ? type.create(attrs).addToSet(marks) : type.removeFromSet(marks); - // :: () #path=ProseMirror#events#activeMarkChange - // Fired when the set of [active marks](#ProseMirror.activeMarks) changes. - this.signal("activeMarkChange"); - } else { - if (to != null ? to : !this.doc.rangeHasMark(sel.from, sel.to, type)) this.apply(this.tr.addMark(sel.from, sel.to, type.create(attrs)));else this.apply(this.tr.removeMark(sel.from, sel.to, type)); - } - } - - // :: () → [Mark] - // Get the marks at the cursor. By default, this yields the marks - // associated with the content at the cursor, as per `Node.marksAt`. - // But `setMark` may have been used to change the set of active - // marks, in which case that set is returned. - }, { - key: "activeMarks", - value: function activeMarks() { - var head; - return this.input.storedMarks || ((head = this.selection.head) ? this.doc.marksAt(head) : []); - } - - // :: () - // Give the editor focus. - }, { - key: "focus", - value: function focus() { - if (this.operation) this.operation.focus = true;else this.sel.toDOM(true); - } - - // :: () → bool - // Query whether the editor has focus. - }, { - key: "hasFocus", - value: function hasFocus() { - if (this.sel.range instanceof _selection2.NodeSelection) return document.activeElement == this.content;else return (0, _selection2.hasFocus)(this); - } - - // :: () → Node - // Get the part of the document that falls within the selection. - }, { - key: "posAtCoords", - - // :: ({top: number, left: number}) → ?Pos - // If the given coordinates (which should be relative to the top - // left corner of the window—not the page) fall within the editable - // content, this method will return the document position that - // corresponds to those coordinates. - value: function posAtCoords(coords) { - return (0, _selection2.posAtCoords)(this, coords); - } - - // :: (Pos) → {top: number, left: number, bottom: number} - // Find the screen coordinates (relative to top left corner of the - // window) of the given document position. - }, { - key: "coordsAtPos", - value: function coordsAtPos(pos) { - this.checkPos(pos); - return (0, _selection2.coordsAtPos)(this, pos); - } - - // :: (?Pos) - // Scroll the given position, or the cursor position if `pos` isn't - // given, into view. - }, { - key: "scrollIntoView", - value: function scrollIntoView() { - var pos = arguments.length <= 0 || arguments[0] === undefined ? null : arguments[0]; - - if (pos) this.checkPos(pos); - this.ensureOperation(); - this.operation.scrollIntoView = pos; - } - - // :: (string, ?[any]) → bool - // Execute the named [command](#Command). If the command takes - // parameters and they are not passed here, the user will be - // prompted for them. - }, { - key: "execCommand", - value: function execCommand(name, params) { - var cmd = this.commands[name]; - return !!(cmd && cmd.exec(this, params) !== false); - } - - // :: (string) → ?string - // Return the name of the key that is bound to the given command, if - // any. - }, { - key: "keyForCommand", - value: function keyForCommand(name) { - var cached = this.commandKeys[name]; - if (cached !== undefined) return cached; - - var cmd = this.commands[name], - keymap = this.baseKeymap; - if (!cmd) return this.commandKeys[name] = null; - var key = cmd.spec.key || (_dom.browser.mac ? cmd.spec.macKey : cmd.spec.pcKey); - if (key) { - key = (0, _keys.normalizeKeyName)(Array.isArray(key) ? key[0] : key); - var deflt = keymap.bindings[key]; - if (Array.isArray(deflt) ? deflt.indexOf(name) > -1 : deflt == name) return this.commandKeys[name] = key; - } - for (var _key in keymap.bindings) { - var bound = keymap.bindings[_key]; - if (Array.isArray(bound) ? bound.indexOf(name) > -1 : bound == name) return this.commandKeys[name] = _key; - } - return this.commandKeys[name] = null; - } - }, { - key: "registry", - value: function registry(name, f) { - var _this2 = this; - - this.schema.registry(name, f); - this.options.registries.forEach(function (reg) { - var array = reg.registry[name]; - if (array) for (var i = 0; i < array.length; i++) f(array[i], _this2); - }); - } - }, { - key: "markRangeDirty", - value: function markRangeDirty(range) { - this.ensureOperation(); - var dirty = this.dirtyNodes; - var from = range.from, - to = range.to; - for (var depth = 0, node = this.doc;; depth++) { - var fromEnd = depth == from.depth, - toEnd = depth == to.depth; - if (!fromEnd && !toEnd && from.path[depth] == to.path[depth]) { - var child = node.child(from.path[depth]); - if (!dirty.has(child)) dirty.set(child, DIRTY_RESCAN); - node = child; - } else { - var _ret = (function () { - var start = fromEnd ? from.offset : from.path[depth]; - var end = toEnd ? to.offset : to.path[depth] + 1; - if (node.isTextblock) { - node.forEach(function (child, cStart, cEnd) { - if (cStart < end && cEnd > start) dirty.set(child, DIRTY_REDRAW); - }); - } else { - for (var i = node.iter(start, end), child = undefined; child = i.next().value;) { - dirty.set(child, DIRTY_REDRAW); - } - } - return "break"; - })(); - - if (_ret === "break") break; - } - } - } - }, { - key: "selection", - get: function get() { - if (!this.accurateSelection) this.ensureOperation(); - return this.sel.range; - } - }, { - key: "tr", - get: function get() { - return new EditorTransform(this); - } - }, { - key: "baseKeymap", - get: function get() { - return this.options.keymap || this.defaultKeymap || (this.defaultKeymap = (0, _commands.defaultKeymap)(this)); - } - }, { - key: "selectedDoc", - get: function get() { - var sel = this.selection; - return this.doc.sliceBetween(sel.from, sel.to); - } - - // :: () → string - // Get the text that falls within the selection. - }, { - key: "selectedText", - get: function get() { - return (0, _serializeText.toText)(this.selectedDoc); - } - }]); - - return ProseMirror; -})(); - -exports.ProseMirror = ProseMirror; -var DIRTY_RESCAN = 1, - DIRTY_REDRAW = 2; - -exports.DIRTY_RESCAN = DIRTY_RESCAN; -exports.DIRTY_REDRAW = DIRTY_REDRAW; -var nullOptions = {}; - -(0, _utilEvent.eventMixin)(ProseMirror); - -var Operation = function Operation(pm) { - _classCallCheck(this, Operation); - - this.doc = pm.doc; - this.sel = pm.sel.range; - this.scrollIntoView = false; - this.focus = false; - this.composingAtStart = !!pm.input.composing; -} - -// ;; #toc=false A selection-aware extension of `Transform`. Use -// `ProseMirror.tr` to create an instance. -; - -var EditorTransform = (function (_Transform) { - _inherits(EditorTransform, _Transform); - - function EditorTransform(pm) { - _classCallCheck(this, EditorTransform); - - _get(Object.getPrototypeOf(EditorTransform.prototype), "constructor", this).call(this, pm.doc); - this.pm = pm; - } - - // :: (?Object) → ?EditorTransform - // Apply the transformation. Returns the transform, or `false` it is - // was empty. - - _createClass(EditorTransform, [{ - key: "apply", - value: function apply(options) { - return this.pm.apply(this, options); - } - - // :: Selection - // Get the editor's current selection, [mapped](#Selection.map) - // through the steps in this transform. - }, { - key: "replaceSelection", - - // :: (?Node, ?bool) → EditorTransform - // Replace the selection with the given node, or delete it if `node` - // is null. When `inheritMarks` is true and the node is an inline - // node, it inherits the marks from the place where it is inserted. - value: function replaceSelection(node, inheritMarks) { - var _selection = this.selection; - var empty = _selection.empty; - var from = _selection.from; - var to = _selection.to; - var selNode = _selection.node;var parent = undefined; - if (node && node.isInline && inheritMarks !== false) { - var marks = empty ? this.pm.input.storedMarks : this.doc.marksAt(from); - node = node.type.create(node.attrs, node.text, marks); - } - - if (selNode && selNode.isTextblock && node && node.isInline) { - // Putting inline stuff onto a selected textblock puts it inside - from = new _model.Pos(from.toPath(), 0); - to = new _model.Pos(from.path, selNode.size); - } else if (selNode) { - // This node can not simply be removed/replaced. Remove its parent as well - while (from.depth && from.offset == 0 && (parent = this.doc.path(from.path)) && from.offset == parent.size - 1 && !parent.type.canBeEmpty && !(node && parent.type.canContain(node))) { - from = from.shorten(); - to = to.shorten(null, 1); - } - } else if (node && node.isBlock && this.doc.path(from.path.slice(0, from.depth - 1)).type.canContain(node)) { - // Inserting a block node into a textblock. Try to insert it above by splitting the textblock - this["delete"](from, to); - var _parent = this.doc.path(from.path); - if (from.offset && from.offset != _parent.size) this.split(from); - return this.insert(from.shorten(null, from.offset ? 1 : 0), node); - } - - if (node) return this.replaceWith(from, to, node);else return this["delete"](from, to); - } - - // :: () → EditorTransform - // Delete the selection. - }, { - key: "deleteSelection", - value: function deleteSelection() { - return this.replaceSelection(); - } - - // :: (string) → EditorTransform - // Replace the selection with a text node containing the given string. - }, { - key: "typeText", - value: function typeText(text) { - return this.replaceSelection(this.pm.schema.text(text), true); - } - }, { - key: "selection", - get: function get() { - return this.steps.length ? this.pm.selection.map(this) : this.pm.selection; - } - }]); - - return EditorTransform; -})(_transform.Transform); - -},{"../dom":1,"../model":27,"../parse":33,"../parse/text":34,"../serialize":36,"../serialize/text":37,"../transform":39,"../util/event":49,"../util/map":50,"../util/sortedinsert":51,"./commands":4,"./css":5,"./draw":7,"./history":8,"./input":10,"./keys":11,"./options":13,"./range":14,"./selection":15}],13:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = (function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); - } - }return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; - }; -})(); - -exports.defineOption = defineOption; -exports.parseOptions = parseOptions; -exports.initOptions = initOptions; -exports.setOption = setOption; - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -var _model = require("../model"); - -// ;; A registry is a namespace for [commands](#Commands), input -// rules, and so on. They provide a way to define commands and such in -// a scoped way, without having them show up on all your editors by -// default all of a sudden. See also the [`registries` -// option](#registries). - -var Registry = (function () { - // :: (string) - // Create a new registry with the given name. - - function Registry(name) { - _classCallCheck(this, Registry); - - this.name = name; - this.registry = Object.create(null); - } - - // :: Registry - // The registry in which built-in commands and input rules are - // registered. The default content of the `registries` option. - - // :: (string, *) - // Register a new item in this registry. - - _createClass(Registry, [{ - key: "register", - value: function register(name, value) { - ;(this.registry[name] || (this.registry[name] = [])).push(value); - } - }]); - - return Registry; -})(); - -exports.Registry = Registry; -var defaultRegistry = new Registry("default"); - -exports.defaultRegistry = defaultRegistry; - -var Option = function Option(defaultValue, update, updateOnInit) { - _classCallCheck(this, Option); - - this.defaultValue = defaultValue; - this.update = update; - this.updateOnInit = updateOnInit !== false; -}; - -var options = Object.create(null); - -// :: (string, any, (pm: ProseMirror, newValue: any, oldValue: any, init: bool), bool) -// Define a new option. The `update` handler will be called with the -// option's old and new value every time the option is -// [changed](#ProseMirror.setOption). When `updateOnInit` is true, it -// is also called on editor init, with null as the old value, and a fourth -// argument of true. - -function defineOption(name, defaultValue, update, updateOnInit) { - options[name] = new Option(defaultValue, update, updateOnInit); -} - -// :: Schema #path=schema #kind=option -// The [schema](#Schema) that the editor's document should use. -defineOption("schema", _model.defaultSchema, false); - -// :: any #path=doc #kind=option -// The starting document. Usually a `Node`, but can be in another -// format when the `docFormat` option is also specified. -defineOption("doc", null, function (pm, value) { - return pm.setDoc(value); -}, false); - -// :: ?string #path=docFormat #kind=option -// The format in which the `doc` option is given. Defaults to `null` -// (a raw `Node`). -defineOption("docFormat", null); - -// :: ?union #path=place #kind=option -// Determines the placement of the editor in the page. When `null`, -// the editor is not placed. When a DOM node is given, the editor is -// appended to that node. When a function is given, it is called -// with the editor's wrapping DOM node, and is expected to place it -// into the document. -defineOption("place", null); - -// :: Keymap #path=keymap #kind=option -// The base [keymap](#Keymap). When not given, a default keymap is -// synthesized from the default key bindings provided by the -// [commands](#Command) that are in scope for the editor. -defineOption("keymap", null); - -// :: [Registry] -// The set of [registries](#Registry) the editor should load items -// from. -defineOption("registries", [defaultRegistry], false); - -// :: number #path=historyDepth #kind=option -// The amount of history events that are collected before the oldest -// events are discarded. Defaults to 100. -defineOption("historyDepth", 100); - -// :: number #path=historyEventDelay #kind=option -// The amount of milliseconds that must pass between changes to -// start a new history event. Defaults to 500. -defineOption("historyEventDelay", 500); - -// :: string #path=commandParamHandler #kind=option -// The name of the handler used to prompt the user for [command -// parameters](#CommandParam). Only relevant when multiple such -// handlers are loaded, and you want to choose between them. -defineOption("commandParamHandler", "default"); - -// :: ?string #path=label #kind=option -// The label of the editor. When set, the editable DOM node gets an -// `aria-label` attribute with this value. -defineOption("label", null); - -function parseOptions(obj) { - var result = Object.create(null); - var given = obj ? [obj].concat(obj.use || []) : []; - outer: for (var opt in options) { - for (var i = 0; i < given.length; i++) { - if (opt in given[i]) { - result[opt] = given[i][opt]; - continue outer; - } - } - result[opt] = options[opt].defaultValue; - } - return result; -} - -function initOptions(pm) { - for (var opt in options) { - var desc = options[opt]; - if (desc.update && desc.updateOnInit) desc.update(pm, pm.options[opt], null, true); - } -} - -function setOption(pm, name, value) { - var desc = options[name]; - if (desc.update === false) throw new Error("Option '" + name + "' can not be changed"); - var old = pm.options[name]; - pm.options[name] = value; - if (desc.update) desc.update(pm, value, old, false); -} - -},{"../model":27}],14:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = (function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); - } - }return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; - }; -})(); - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -var _utilEvent = require("../util/event"); - -// ;; A [marked range](#ProseMirror.markRange). Includes the methods -// from the [event mixin](#EventMixin). - -var MarkedRange = (function () { - function MarkedRange(from, to, options) { - _classCallCheck(this, MarkedRange); - - this.options = options || {}; - // :: ?Pos - // The current start position of the range. Updated whenever the - // editor's document is changed. Set to `null` when the marked - // range is [removed](#ProseMirror.removeRange). - this.from = from; - // :: ?Pos - // The current end position of the range. Updated whenever the - // editor's document is changed. Set to `null` when the marked - // range is [removed](#ProseMirror.removeRange). - this.to = to; - } - - _createClass(MarkedRange, [{ - key: "remove", - value: function remove() { - // :: (from: Pos, to: Pos) #path=MarkedRange#events#removed - // Signalled when the marked range is removed from the editor. - this.signal("removed", this.from, this.to.max(this.from)); - this.from = this.to = null; - } - }]); - - return MarkedRange; -})(); - -exports.MarkedRange = MarkedRange; - -(0, _utilEvent.eventMixin)(MarkedRange); - -var RangeSorter = (function () { - function RangeSorter() { - _classCallCheck(this, RangeSorter); - - this.sorted = []; - } - - _createClass(RangeSorter, [{ - key: "find", - value: function find(at) { - var min = 0, - max = this.sorted.length; - for (;;) { - if (max < min + 10) { - for (var i = min; i < max; i++) { - if (this.sorted[i].at.cmp(at) >= 0) return i; - }return max; - } - var mid = min + max >> 1; - if (this.sorted[mid].at.cmp(at) > 0) max = mid;else min = mid; - } - } - }, { - key: "insert", - value: function insert(obj) { - this.sorted.splice(this.find(obj.at), 0, obj); - } - }, { - key: "remove", - value: function remove(at, range) { - var pos = this.find(at); - for (var dist = 0;; dist++) { - var leftPos = pos - dist - 1, - rightPos = pos + dist; - if (leftPos >= 0 && this.sorted[leftPos].range == range) { - this.sorted.splice(leftPos, 1); - return; - } else if (rightPos < this.sorted.length && this.sorted[rightPos].range == range) { - this.sorted.splice(rightPos, 1); - return; - } - } - } - }, { - key: "resort", - value: function resort() { - for (var i = 0; i < this.sorted.length; i++) { - var cur = this.sorted[i]; - var at = cur.at = cur.type == "open" ? cur.range.from : cur.range.to; - var pos = i; - while (pos > 0 && this.sorted[pos - 1].at.cmp(at) > 0) { - this.sorted[pos] = this.sorted[pos - 1]; - this.sorted[--pos] = cur; - } - } - } - }]); - - return RangeSorter; -})(); - -var RangeStore = (function () { - function RangeStore(pm) { - _classCallCheck(this, RangeStore); - - this.pm = pm; - this.ranges = []; - this.sorted = new RangeSorter(); - } - - _createClass(RangeStore, [{ - key: "addRange", - value: function addRange(range) { - this.ranges.push(range); - this.sorted.insert({ type: "open", at: range.from, range: range }); - this.sorted.insert({ type: "close", at: range.to, range: range }); - this.pm.markRangeDirty(range); - } - }, { - key: "removeRange", - value: function removeRange(range) { - var found = this.ranges.indexOf(range); - if (found > -1) { - this.ranges.splice(found, 1); - this.sorted.remove(range.from, range); - this.sorted.remove(range.to, range); - this.pm.markRangeDirty(range); - range.remove(); - } - } - }, { - key: "transform", - value: function transform(mapping) { - for (var i = 0; i < this.ranges.length; i++) { - var range = this.ranges[i]; - range.from = mapping.map(range.from, range.options.inclusiveLeft ? -1 : 1).pos; - range.to = mapping.map(range.to, range.options.inclusiveRight ? 1 : -1).pos; - var diff = range.from.cmp(range.to); - if (range.options.removeWhenEmpty !== false && diff >= 0) { - this.removeRange(range); - i--; - } else if (diff > 0) { - range.to = range.from; - } - } - this.sorted.resort(); - } - }, { - key: "activeRangeTracker", - value: function activeRangeTracker() { - return new RangeTracker(this.sorted.sorted); - } - }]); - - return RangeStore; -})(); - -exports.RangeStore = RangeStore; - -var RangeTracker = (function () { - function RangeTracker(sorted) { - _classCallCheck(this, RangeTracker); - - this.sorted = sorted; - this.pos = 0; - this.current = []; - } - - _createClass(RangeTracker, [{ - key: "advanceTo", - value: function advanceTo(pos) { - var next = undefined; - while (this.pos < this.sorted.length && (next = this.sorted[this.pos]).at.cmp(pos) <= 0) { - var className = next.range.options.className; - if (!className) continue; - if (next.type == "open") this.current.push(className);else this.current.splice(this.current.indexOf(className), 1); - this.pos++; - } - } - }, { - key: "nextChangeBefore", - value: function nextChangeBefore(pos) { - for (;;) { - if (this.pos == this.sorted.length) return null; - var next = this.sorted[this.pos]; - if (!next.range.options.className) this.pos++;else if (next.at.cmp(pos) >= 0) return null;else return next.at.offset; - } - } - }]); - - return RangeTracker; -})(); - -},{"../util/event":49}],15:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _get = function get(_x, _x2, _x3) { - var _again = true;_function: while (_again) { - var object = _x, - property = _x2, - receiver = _x3;_again = false;if (object === null) object = Function.prototype;var desc = Object.getOwnPropertyDescriptor(object, property);if (desc === undefined) { - var parent = Object.getPrototypeOf(object);if (parent === null) { - return undefined; - } else { - _x = parent;_x2 = property;_x3 = receiver;_again = true;desc = parent = undefined;continue _function; - } - } else if ("value" in desc) { - return desc.value; - } else { - var getter = desc.get;if (getter === undefined) { - return undefined; - }return getter.call(receiver); - } - } -}; - -var _createClass = (function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); - } - }return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; - }; -})(); - -exports.posFromDOM = posFromDOM; -exports.rangeFromDOMLoose = rangeFromDOMLoose; -exports.findByPath = findByPath; -exports.resolvePath = resolvePath; -exports.hasFocus = hasFocus; -exports.posAtCoords = posAtCoords; -exports.coordsAtPos = coordsAtPos; -exports.scrollIntoView = scrollIntoView; -exports.findSelectionFrom = findSelectionFrom; -exports.findSelectionNear = findSelectionNear; -exports.findSelectionAtStart = findSelectionAtStart; -exports.findSelectionAtEnd = findSelectionAtEnd; -exports.selectableNodeAbove = selectableNodeAbove; -exports.handleNodeClick = handleNodeClick; -exports.verticalMotionLeavesTextblock = verticalMotionLeavesTextblock; -exports.setDOMSelectionToPos = setDOMSelectionToPos; - -function _inherits(subClass, superClass) { - if (typeof superClass !== "function" && superClass !== null) { - throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); - }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; -} - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -var _model = require("../model"); - -var _dom = require("../dom"); - -var SelectionState = (function () { - function SelectionState(pm) { - var _this = this; - - _classCallCheck(this, SelectionState); - - this.pm = pm; - - this.range = findSelectionAtStart(pm.doc); - this.lastNonNodePos = null; - - this.pollState = null; - this.pollTimeout = null; - this.lastAnchorNode = this.lastHeadNode = this.lastAnchorOffset = this.lastHeadOffset = null; - this.lastNode = null; - - pm.content.addEventListener("focus", function () { - return _this.receivedFocus(); - }); - } - - _createClass(SelectionState, [{ - key: "setAndSignal", - value: function setAndSignal(range, clearLast) { - this.set(range, clearLast); - // :: () #path=ProseMirror#events#selectionChange - // Indicates that the editor's selection has changed. - this.pm.signal("selectionChange"); - } - }, { - key: "set", - value: function set(range, clearLast) { - this.range = range; - if (!range.node) this.lastNonNodePos = null; - if (clearLast !== false) this.lastAnchorNode = null; - } - }, { - key: "pollForUpdate", - value: function pollForUpdate() { - var _this2 = this; - - if (this.pm.input.composing) return; - clearTimeout(this.pollTimeout); - this.pollState = "update"; - var n = 0, - check = function check() { - if (_this2.pm.input.composing) { - // Abort - } else if (_this2.pm.operation) { - _this2.pollTimeout = setTimeout(check, 20); - } else if (!_this2.readUpdate() && ++n == 1) { - _this2.pollTimeout = setTimeout(check, 50); - } else { - _this2.stopPollingForUpdate(); - } - }; - this.pollTimeout = setTimeout(check, 20); - } - }, { - key: "stopPollingForUpdate", - value: function stopPollingForUpdate() { - if (this.pollState == "update") { - this.pollState = null; - this.pollToSync(); - } - } - }, { - key: "domChanged", - value: function domChanged() { - var sel = getSelection(); - return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset || sel.focusNode != this.lastHeadNode || sel.focusOffset != this.lastHeadOffset; - } - }, { - key: "storeDOMState", - value: function storeDOMState() { - var sel = getSelection(); - this.lastAnchorNode = sel.anchorNode;this.lastAnchorOffset = sel.anchorOffset; - this.lastHeadNode = sel.focusNode;this.lastHeadOffset = sel.focusOffset; - } - }, { - key: "readUpdate", - value: function readUpdate() { - if (this.pm.input.composing || !hasFocus(this.pm) || !this.domChanged()) return false; - - var sel = getSelection(), - doc = this.pm.doc; - var anchor = posFromDOMInner(this.pm, sel.anchorNode, sel.anchorOffset); - var head = posFromDOMInner(this.pm, sel.focusNode, sel.focusOffset); - var newSel = findSelectionNear(doc, head, this.range.head && this.range.head.cmp(head) < 0 ? -1 : 1); - if (newSel instanceof TextSelection && doc.path(anchor.path).isTextblock) newSel = new TextSelection(anchor, newSel.head); - this.setAndSignal(newSel); - if (newSel instanceof NodeSelection || newSel.head.cmp(head) || newSel.anchor.cmp(anchor)) { - this.toDOM(); - } else { - this.clearNode(); - this.storeDOMState(); - } - return true; - } - }, { - key: "pollToSync", - value: function pollToSync() { - var _this3 = this; - - if (this.pollState) return; - this.pollState = "sync"; - var sync = function sync() { - if (document.activeElement != _this3.pm.content) { - _this3.pollState = null; - } else { - if (!_this3.pm.operation && !_this3.pm.input.composing) _this3.syncDOM(); - _this3.pollTimeout = setTimeout(sync, 200); - } - }; - this.pollTimeout = setTimeout(sync, 200); - } - }, { - key: "syncDOM", - value: function syncDOM() { - if (!this.pm.input.composing && hasFocus(this.pm) && this.domChanged()) this.toDOM(); - } - }, { - key: "toDOM", - value: function toDOM(takeFocus) { - if (this.range instanceof NodeSelection) this.nodeToDOM(takeFocus);else this.rangeToDOM(takeFocus); - } - }, { - key: "nodeToDOM", - value: function nodeToDOM(takeFocus) { - window.getSelection().removeAllRanges(); - if (takeFocus) this.pm.content.focus(); - var pos = this.range.from, - node = this.range.node; - var dom = resolvePath(this.pm.content, pos.toPath()); - if (dom == this.lastNode) return; - this.clearNode(); - addNodeSelection(node, dom); - this.lastNode = dom; - } - }, { - key: "clearNode", - value: function clearNode() { - if (this.lastNode) { - clearNodeSelection(this.lastNode); - this.lastNode = null; - return true; - } - } - }, { - key: "rangeToDOM", - value: function rangeToDOM(takeFocus) { - var sel = window.getSelection(); - if (!this.clearNode() && !hasFocus(this.pm)) { - if (!takeFocus) return; - // See https://bugzilla.mozilla.org/show_bug.cgi?id=921444 - else if (_dom.browser.gecko) this.pm.content.focus(); - } - if (!this.domChanged()) return; - - var range = document.createRange(); - var content = this.pm.content; - var anchor = DOMFromPos(content, this.range.anchor); - var head = DOMFromPos(content, this.range.head); - - if (sel.extend) { - range.setEnd(anchor.node, anchor.offset); - range.collapse(false); - } else { - if (this.range.anchor.cmp(this.range.head) > 0) { - var tmp = anchor;anchor = head;head = tmp; - } - range.setEnd(head.node, head.offset); - range.setStart(anchor.node, anchor.offset); - } - sel.removeAllRanges(); - sel.addRange(range); - if (sel.extend) sel.extend(head.node, head.offset); - this.storeDOMState(); - } - }, { - key: "receivedFocus", - value: function receivedFocus() { - if (!this.pollState) this.pollToSync(); - } - }, { - key: "beforeStartOp", - value: function beforeStartOp() { - if (this.pollState == "update" && this.readUpdate()) { - clearTimeout(this.pollTimeout); - this.stopPollingForUpdate(); - } else { - this.syncDOM(); - } - } - }]); - - return SelectionState; -})(); - -exports.SelectionState = SelectionState; - -function clearNodeSelection(dom) { - dom.classList.remove("ProseMirror-selectednode"); -} - -function addNodeSelection(_node, dom) { - dom.classList.add("ProseMirror-selectednode"); -} - -function windowRect() { - return { left: 0, right: window.innerWidth, - top: 0, bottom: window.innerHeight }; -} - -// ;; An editor selection. Can be one of two selection types: -// `TextSelection` and `NodeSelection`. Both have the properties -// listed here, but also contain more information (such as the -// selected [node](#NodeSelection.node) or the -// [head](#TextSelection.head) and [anchor](#TextSelection.anchor)). - -var Selection = function Selection() { - _classCallCheck(this, Selection); -}; - -exports.Selection = Selection; - -// :: Pos #path=Selection.prototype.from -// The start of the selection. - -// :: Pos #path=Selection.prototype.to -// The end of the selection. - -// :: bool #path=Selection.empty -// True if the selection is an empty text selection (head an anchor -// are the same). - -// :: (other: Selection) → bool #path=Selection.eq -// Test whether the selection is the same as another selection. - -// :: (doc: Node, mapping: Mappable) → Selection #path=Selection.map -// Map this selection through a [mappable](#Mappable) thing. `doc` -// should be the new document, to which we are mapping. - -// ;; #toc=false A text selection represents a classical editor -// selection, with a head (the moving side) and anchor (immobile -// side), both of which point into textblock nodes. It can be empty (a -// regular cursor position). - -var TextSelection = (function (_Selection) { - _inherits(TextSelection, _Selection); - - // :: (Pos, ?Pos) - // Construct a text selection. When `head` is not given, it defaults - // to `anchor`. - - function TextSelection(anchor, head) { - _classCallCheck(this, TextSelection); - - _get(Object.getPrototypeOf(TextSelection.prototype), "constructor", this).call(this); - // :: Pos - // The selection's immobile side (does not move when pressing - // shift-arrow). - this.anchor = anchor; - // :: Pos - // The selection's mobile side (the side that moves when pressing - // shift-arrow). - this.head = head || anchor; - } - - // ;; #toc=false A node selection is a selection that points at a - // single node. All nodes marked [selectable](#NodeType.selectable) - // can be the target of a node selection. In such an object, `from` - // and `to` point directly before and after the selected node. - - _createClass(TextSelection, [{ - key: "eq", - value: function eq(other) { - return other instanceof TextSelection && !other.head.cmp(this.head) && !other.anchor.cmp(this.anchor); - } - }, { - key: "map", - value: function map(doc, mapping) { - var head = mapping.map(this.head).pos; - if (!doc.path(head.path).isTextblock) return findSelectionNear(doc, head); - var anchor = mapping.map(this.anchor).pos; - return new TextSelection(doc.path(anchor.path).isTextblock ? anchor : head, head); - } - }, { - key: "inverted", - get: function get() { - return this.anchor.cmp(this.head) > 0; - } - }, { - key: "from", - get: function get() { - return this.inverted ? this.head : this.anchor; - } - }, { - key: "to", - get: function get() { - return this.inverted ? this.anchor : this.head; - } - }, { - key: "empty", - get: function get() { - return this.anchor.cmp(this.head) == 0; - } - }]); - - return TextSelection; -})(Selection); - -exports.TextSelection = TextSelection; - -var NodeSelection = (function (_Selection2) { - _inherits(NodeSelection, _Selection2); - - // :: (Pos, Pos, Node) - // Create a node selection. Does not verify the validity of its - // arguments. Use `ProseMirror.setNodeSelection` for an easier, - // error-checking way to create a node selection. - - function NodeSelection(from, to, node) { - _classCallCheck(this, NodeSelection); - - _get(Object.getPrototypeOf(NodeSelection.prototype), "constructor", this).call(this); - this.from = from; - this.to = to; - // :: Node The selected node. - this.node = node; - } - - _createClass(NodeSelection, [{ - key: "eq", - value: function eq(other) { - return other instanceof NodeSelection && !this.from.cmp(other.from); - } - }, { - key: "map", - value: function map(doc, mapping) { - var from = mapping.map(this.from, 1).pos; - var to = mapping.map(this.to, -1).pos; - if (_model.Pos.samePath(from.path, to.path) && from.offset == to.offset - 1) { - var node = doc.nodeAfter(from); - if (node.type.selectable) return new NodeSelection(from, to, node); - } - return findSelectionNear(doc, from); - } - }, { - key: "empty", - get: function get() { - return false; - } - }]); - - return NodeSelection; -})(Selection); - -exports.NodeSelection = NodeSelection; - -function pathFromDOM(pm, node) { - var path = []; - for (; node != pm.content;) { - var attr = node.getAttribute("pm-offset"); - if (attr) path.unshift(+attr); - node = node.parentNode; - } - return path; -} - -function widthFromDOM(dom) { - var attr = dom.getAttribute("pm-leaf"); - return attr && attr != "true" ? +attr : 1; -} - -function posFromDOMInner(pm, dom, domOffset, loose) { - if (!loose && pm.operation && pm.doc != pm.operation.doc) throw new Error("Fetching a position from an outdated DOM structure"); - - var extraOffset = 0, - tag = undefined; - for (;;) { - var adjust = 0; - if (dom.nodeType == 3) { - extraOffset += domOffset; - } else if (dom.hasAttribute("pm-offset") || dom == pm.content) { - break; - } else if (tag = dom.getAttribute("pm-inner-offset")) { - extraOffset += +tag; - adjust = -1; - } else if (domOffset && domOffset == dom.childNodes.length) { - adjust = 1; - } - - var _parent = dom.parentNode; - domOffset = adjust < 0 ? 0 : Array.prototype.indexOf.call(_parent.childNodes, dom) + adjust; - dom = _parent; - } - - var path = pathFromDOM(pm, dom); - if (dom.hasAttribute("pm-leaf")) return _model.Pos.from(path, extraOffset + (domOffset ? 1 : 0)); - - var offset = 0; - for (var i = domOffset - 1; i >= 0; i--) { - var child = dom.childNodes[i]; - if (child.nodeType == 3) { - if (loose) extraOffset += child.nodeValue.length; - } else if (tag = child.getAttribute("pm-offset")) { - offset = +tag + widthFromDOM(child); - break; - } else if (loose && !child.hasAttribute("pm-ignore")) { - extraOffset += child.textContent.length; - } - } - return new _model.Pos(path, offset + extraOffset); -} - -function posFromDOM(pm, node, offset) { - if (offset == null) { - offset = Array.prototype.indexOf.call(node.parentNode.childNodes, node); - node = node.parentNode; - } - return posFromDOMInner(pm, node, offset); -} - -function rangeFromDOMLoose(pm) { - if (!hasFocus(pm)) return null; - var sel = getSelection(); - return new TextSelection(posFromDOMInner(pm, sel.anchorNode, sel.anchorOffset, true), posFromDOMInner(pm, sel.focusNode, sel.focusOffset, true)); -} - -function findByPath(node, n, fromEnd) { - for (var ch = fromEnd ? node.lastChild : node.firstChild; ch; ch = fromEnd ? ch.previousSibling : ch.nextSibling) { - if (ch.nodeType != 1) continue; - var offset = ch.getAttribute("pm-offset"); - if (!offset) { - var found = findByPath(ch, n); - if (found) return found; - } else if (+offset == n) { - return ch; - } - } -} - -function resolvePath(parent, path) { - var node = parent; - for (var i = 0; i < path.length; i++) { - node = findByPath(node, path[i]); - if (!node) throw new Error("Failed to resolve path " + path.join("/")); - } - return node; -} - -function findByOffset(node, offset, after) { - function search(node) { - for (var ch = node.firstChild, i = 0, attr = undefined; ch; ch = ch.nextSibling, i++) { - if (ch.nodeType != 1) continue; - if (attr = ch.getAttribute("pm-offset")) { - var diff = offset - +attr, - width = widthFromDOM(ch); - if (diff >= 0 && (after ? diff <= width : diff < width)) return { node: ch, offset: i, innerOffset: diff }; - } else { - var result = search(ch); - if (result) return result; - } - } - } - return search(node); -} - -function leafAt(node, offset) { - for (;;) { - var child = node.firstChild; - if (!child) return { node: node, offset: offset }; - if (child.nodeType != 1) return { node: child, offset: offset }; - if (child.hasAttribute("pm-inner-offset")) { - var nodeOffset = 0; - for (;;) { - var nextSib = child.nextSibling, - nextOffset = undefined; - if (!nextSib || (nextOffset = +nextSib.getAttribute("pm-inner-offset")) >= offset) break; - child = nextSib; - nodeOffset = nextOffset; - } - offset -= nodeOffset; - } - node = child; - } -} - -/** - * Get a DOM element at a given position in the document. - * - * @param {Node} parent The parent DOM node. - * @param {Pos} pos The position in the document. - * @return {Object} The DOM node and character offset inside the node. - */ -function DOMFromPos(parent, pos) { - var dom = resolvePath(parent, pos.path); - var found = findByOffset(dom, pos.offset, true), - inner = undefined; - if (!found) return { node: dom, offset: 0 }; - if (found.node.getAttribute("pm-leaf") == "true" || !(inner = leafAt(found.node, found.innerOffset))) return { node: found.node.parentNode, offset: found.offset + (found.innerOffset ? 1 : 0) };else return inner; -} - -function hasFocus(pm) { - var sel = window.getSelection(); - return sel.rangeCount && (0, _dom.contains)(pm.content, sel.anchorNode); -} - -/** - * Given an x,y position on the editor, get the position in the document. - * - * @param {ProseMirror} pm Editor instance. - * @param {Object} coords The x, y coordinates. - * @return {Pos} - */ -// FIXME fails on the space between lines -// FIXME reformulate as selectionAtCoords? So that it can't return null - -function posAtCoords(pm, coords) { - var element = document.elementFromPoint(coords.left, coords.top + 1); - if (!(0, _dom.contains)(pm.content, element)) return null; - - var offset = undefined; - if (element.childNodes.length == 1 && element.firstChild.nodeType == 3) { - element = element.firstChild; - offset = offsetInTextNode(element, coords); - } else { - offset = offsetInElement(element, coords); - } - - return posFromDOM(pm, element, offset); -} - -function textRect(node, from, to) { - var range = document.createRange(); - range.setEnd(node, to); - range.setStart(node, from); - return range.getBoundingClientRect(); -} - -/** - * Given a position in the document model, get a bounding box of the character at - * that position, relative to the window. - * - * @param {ProseMirror} pm The editor instance. - * @param {Pos} pos - * @return {Object} The bounding box. - */ - -function coordsAtPos(pm, pos) { - var _DOMFromPos = DOMFromPos(pm.content, pos); - - var node = _DOMFromPos.node; - var offset = _DOMFromPos.offset; - - var side = undefined, - rect = undefined; - if (node.nodeType == 3) { - if (offset < node.nodeValue.length) { - rect = textRect(node, offset, offset + 1); - side = "left"; - } - if ((!rect || rect.left == rect.right) && offset) { - rect = textRect(node, offset - 1, offset); - side = "right"; - } - } else if (node.firstChild) { - if (offset < node.childNodes.length) { - var child = node.childNodes[offset]; - rect = child.nodeType == 3 ? textRect(child, 0, child.nodeValue.length) : child.getBoundingClientRect(); - side = "left"; - } - if ((!rect || rect.left == rect.right) && offset) { - var child = node.childNodes[offset - 1]; - rect = child.nodeType == 3 ? textRect(child, 0, child.nodeValue.length) : child.getBoundingClientRect(); - side = "right"; - } - } else { - rect = node.getBoundingClientRect(); - side = "left"; - } - var x = rect[side]; - return { top: rect.top, bottom: rect.bottom, left: x, right: x }; -} - -var scrollMargin = 5; - -function scrollIntoView(pm, pos) { - if (!pos) pos = pm.sel.range.head || pm.sel.range.from; - var coords = coordsAtPos(pm, pos); - for (var _parent2 = pm.content;; _parent2 = _parent2.parentNode) { - var atBody = _parent2 == document.body; - var rect = atBody ? windowRect() : _parent2.getBoundingClientRect(); - var moveX = 0, - moveY = 0; - if (coords.top < rect.top) moveY = -(rect.top - coords.top + scrollMargin);else if (coords.bottom > rect.bottom) moveY = coords.bottom - rect.bottom + scrollMargin; - if (coords.left < rect.left) moveX = -(rect.left - coords.left + scrollMargin);else if (coords.right > rect.right) moveX = coords.right - rect.right + scrollMargin; - if (moveX || moveY) { - if (atBody) window.scrollBy(moveX, moveY); - } else { - if (moveY) _parent2.scrollTop += moveY; - if (moveX) _parent2.scrollLeft += moveX; - } - if (atBody) break; - } -} - -function offsetInRects(coords, rects, strict) { - var y = coords.top; - var x = coords.left; - - var minY = 1e8, - minX = 1e8, - offset = 0; - for (var i = 0; i < rects.length; i++) { - var rect = rects[i]; - if (!rect || rect.top == rect.bottom) continue; - var dX = x < rect.left ? rect.left - x : x > rect.right ? x - rect.right : 0; - if (dX > minX) continue; - if (dX < minX) { - minX = dX;minY = 1e8; - } - var dY = y < rect.top ? rect.top - y : y > rect.bottom ? y - rect.bottom : 0; - if (dY < minY) { - minY = dY; - offset = x < (rect.left + rect.right) / 2 ? i : i + 1; - } - } - if (strict && (minX || minY)) return null; - return offset; -} - -function offsetInTextNode(text, coords, strict) { - var len = text.nodeValue.length; - var range = document.createRange(); - var rects = []; - for (var i = 0; i < len; i++) { - range.setEnd(text, i + 1); - range.setStart(text, i); - rects.push(range.getBoundingClientRect()); - } - return offsetInRects(coords, rects, strict); -} - -function offsetInElement(element, coords) { - var rects = []; - for (var child = element.firstChild; child; child = child.nextSibling) { - if (child.getBoundingClientRect) rects.push(child.getBoundingClientRect());else rects.push(null); - } - return offsetInRects(coords, rects); -} - -function findSelectionIn(doc, path, offset, dir, text) { - var node = doc.path(path); - if (node.isTextblock) return new TextSelection(new _model.Pos(path, offset)); - - for (var i = offset + (dir > 0 ? 0 : -1); dir > 0 ? i < node.size : i >= 0; i += dir) { - var child = node.child(i); - if (!text && child.type.contains == null && child.type.selectable) return new NodeSelection(new _model.Pos(path, i), new _model.Pos(path, i + 1), child); - path.push(i); - var inside = findSelectionIn(doc, path, dir < 0 ? child.size : 0, dir, text); - if (inside) return inside; - path.pop(); - } -} - -// FIXME we'll need some awareness of bidi motion when determining block start and end - -function findSelectionFrom(doc, pos, dir, text) { - for (var path = pos.path.slice(), offset = pos.offset;;) { - var found = findSelectionIn(doc, path, offset, dir, text); - if (found) return found; - if (!path.length) break; - offset = path.pop() + (dir > 0 ? 1 : 0); - } -} - -function findSelectionNear(doc, pos, bias, text) { - if (bias === undefined) bias = 1; - - var result = findSelectionFrom(doc, pos, bias, text) || findSelectionFrom(doc, pos, -bias, text); - if (!result) throw new Error("Searching for selection in invalid document " + doc); - return result; -} - -function findSelectionAtStart(node, path, text) { - if (path === undefined) path = []; - - return findSelectionIn(node, path.slice(), 0, 1, text); -} - -function findSelectionAtEnd(node, path, text) { - if (path === undefined) path = []; - - return findSelectionIn(node, path.slice(), node.size, -1, text); -} - -// ;; #path=NodeType #kind=class #noAnchor -// You can add several properties to [node types](#NodeType) to -// influence the way the editor interacts with them. - -// :: (node: Node, path: [number], dom: DOMNode, coords: {left: number, top: number}) → ?Pos -// #path=NodeType.prototype.countCoordsAsChild -// Specifies that, if this node is clicked, a child node might -// actually be meant. This is used to, for example, make clicking a -// list marker (which, in the DOM, is part of the list node) select -// the list item it belongs to. Should return null if the given -// coordinates don't refer to a child node, or the [position](#Pos) -// before thechild otherwise. - -function selectableNodeAbove(pm, dom, coords, liberal) { - for (; dom && dom != pm.content; dom = dom.parentNode) { - if (dom.hasAttribute("pm-offset")) { - var path = pathFromDOM(pm, dom), - node = pm.doc.path(path); - if (node.type.countCoordsAsChild) { - var result = node.type.countCoordsAsChild(node, path, dom, coords); - if (result) return result; - } - // Leaf nodes are implicitly clickable - if ((liberal || node.type.contains == null) && node.type.selectable) return _model.Pos.from(path); - if (!liberal) return null; - } - } -} - -// :: (pm: ProseMirror, event: MouseEvent, path: [number], node: Node) → bool -// #path=NodeType.prototype.handleClick -// If a node is directly clicked (that is, the click didn't land in a -// DOM node belonging to a child node), and its type has a -// `handleClick` method, that method is given a chance to handle the -// click. The method is called, and should return `false` if it did -// _not_ handle the click. -// -// The `event` passed is the event for `"mousedown"`, but calling -// `preventDefault` on it has no effect, since this method is only -// called after a corresponding `"mouseup"` has occurred and -// ProseMirror has determined that this is not a drag or multi-click -// event. - -function handleNodeClick(pm, event) { - for (var dom = event.target; dom && dom != pm.content; dom = dom.parentNode) { - if (dom.hasAttribute("pm-offset")) { - var path = pathFromDOM(pm, dom), - node = pm.doc.path(path); - return node.type.handleClick && node.type.handleClick(pm, event, path, node) !== false; - } - } -} - -function verticalMotionLeavesTextblock(pm, pos, dir) { - var dom = resolvePath(pm.content, pos.path); - var coords = coordsAtPos(pm, pos); - for (var child = dom.firstChild; child; child = child.nextSibling) { - if (child.nodeType != 1) continue; - var boxes = child.getClientRects(); - for (var i = 0; i < boxes.length; i++) { - var box = boxes[i]; - if (dir < 0 ? box.bottom < coords.top : box.top > coords.bottom) return false; - } - } - return true; -} - -function setDOMSelectionToPos(pm, pos) { - var _DOMFromPos2 = DOMFromPos(pm.content, pos); - - var node = _DOMFromPos2.node; - var offset = _DOMFromPos2.offset; - - var range = document.createRange(); - range.setEnd(node, offset); - range.setStart(node, offset); - var sel = getSelection(); - sel.removeAllRanges(); - sel.addRange(range); -} - -},{"../dom":1,"../model":27}],16:[function(require,module,exports){ -"use strict"; - -var _model = require("../model"); - -var _edit = require("../edit"); - -var _inputrules = require("./inputrules"); - -// :: bool #path=autoInput #kind=option -// When set to true, enables the input rules stored under the -// `"autoInput"` name in the editor's -// [`registry`](#ProseMirror.registry)—by default, these are things -// like smart quotes, and automatically wrapping a block in a list if -// you start it with `"1. "`. -(0, _edit.defineOption)("autoInput", false, function (pm, val) { - if (pm.mod.autoInput) { - pm.mod.autoInput.forEach(function (name) { - return (0, _inputrules.removeInputRule)(pm, name); - }); - pm.mod.autoInput = null; - } - if (val) { - pm.mod.autoInput = []; - pm.registry("autoInput", function (rule, type) { - pm.mod.autoInput.push(rule.name); - if (rule.handler.bind) rule = new _inputrules.InputRule(rule.name, rule.match, rule.filter, rule.handler.bind(type)); - (0, _inputrules.addInputRule)(pm, rule); - }); - } -}); - -_edit.defaultRegistry.register("autoInput", new _inputrules.InputRule("emDash", /--$/, "-", "—")); - -_edit.defaultRegistry.register("autoInput", new _inputrules.InputRule("openDoubleQuote", /\s(")$/, '"', "“")); - -_edit.defaultRegistry.register("autoInput", new _inputrules.InputRule("closeDoubleQuote", /"$/, '"', "”")); - -_edit.defaultRegistry.register("autoInput", new _inputrules.InputRule("openSingleQuote", /\s(')$/, "'", "‘")); - -_edit.defaultRegistry.register("autoInput", new _inputrules.InputRule("closeSingleQuote", /'$/, "'", "’")); - -_model.BlockQuote.register("autoInput", new _inputrules.InputRule("startBlockQuote", /^\s*> $/, " ", function (pm, _, pos) { - wrapAndJoin(pm, pos, this); -})); - -_model.OrderedList.register("autoInput", new _inputrules.InputRule("startOrderedList", /^(\d+)\. $/, " ", function (pm, match, pos) { - var order = +match[1]; - wrapAndJoin(pm, pos, this, { order: order || null }, function (node) { - return node.size + (node.attrs.order || 1) == order; - }); -})); - -_model.BulletList.register("autoInput", new _inputrules.InputRule("startBulletList", /^\s*([-+*]) $/, " ", function (pm, match, pos) { - var bullet = match[1]; - wrapAndJoin(pm, pos, this, null, function (node) { - return node.attrs.bullet == bullet; - }); -})); - -_model.CodeBlock.register("autoInput", new _inputrules.InputRule("startCodeBlock", /^```$/, "`", function (pm, _, pos) { - setAs(pm, pos, this, { params: "" }); -})); - -_model.Heading.register("autoInput", new _inputrules.InputRule("startHeading", /^(#{1,6}) $/, " ", function (pm, match, pos) { - setAs(pm, pos, this, { level: match[1].length }); -})); - -function wrapAndJoin(pm, pos, type) { - var attrs = arguments.length <= 3 || arguments[3] === undefined ? null : arguments[3]; - var predicate = arguments.length <= 4 || arguments[4] === undefined ? null : arguments[4]; - - var before = pos.shorten(); - var sibling = before.offset > 0 && pm.doc.path(before.path).child(before.offset - 1); - var join = sibling && sibling.type.name == type && (!predicate || predicate(sibling)); - var tr = pm.tr.wrap(pos, pos, type, attrs); - var delPos = tr.map(pos).pos; - tr["delete"](new _model.Pos(delPos.path, 0), delPos); - if (join) tr.join(before); - tr.apply(); -} - -function setAs(pm, pos, type, attrs) { - pm.tr.setBlockType(pos, pos, type, attrs)["delete"](new _model.Pos(pos.path, 0), pos).apply(); -} - -},{"../edit":9,"../model":27,"./inputrules":17}],17:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = (function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); - } - }return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; - }; -})(); - -exports.addInputRule = addInputRule; -exports.removeInputRule = removeInputRule; - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -var _model = require("../model"); - -var _edit = require("../edit"); - -// :: (ProseMirror, InputRule) -// Add the given [input rule](#InputRule) to an editor. From now on, -// whenever the rule's pattern is typed, its handler is activated. -// -// Note that the effect of an input rule can be canceled by pressing -// Backspace right after it happens. - -function addInputRule(pm, rule) { - if (!pm.mod.interpretInput) pm.mod.interpretInput = new InputRules(pm); - pm.mod.interpretInput.addRule(rule); -} - -// :: (ProseMirror, string) -// Remove the input rule with the given name (added earlier with -// `addInputRule`) from the editor. - -function removeInputRule(pm, name) { - var ii = pm.mod.interpretInput; - if (!ii) return; - ii.removeRule(name); - if (ii.rules.length == 0) { - ii.unregister(); - pm.mod.interpretInput = null; - } -} - -// ;; Input rules are regular expressions describing a piece of text -// that, when typed, causes something to happen. This might be -// changing two dashes into an emdash, wrapping a paragraph starting -// with `"> "` into a blockquote, or something entirely different. - -var InputRule = -// :: (string, RegExp, ?string, union) -// Create an input rule. Its name is used to identify it (to disable -// it). The rule applies when the user typed something and the text -// directly in front of the cursor matches `match`, which should -// probably end with `$`. You can optionally provide a filter, which -// should be a single character that always appears at the end of -// the match, and will be used to only apply the rule when there's -// an actual chance of it succeeding. -// -// The `handler` can be a string, in which case the matched text -// will simply be replaced by that string, or a function, which will -// be called with the match array produced by -// [`RegExp.exec`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec), -// and should produce the effect of the rule. -function InputRule(name, match, filter, handler) { - _classCallCheck(this, InputRule); - - this.name = name; - this.filter = filter; - this.match = match; - this.handler = handler; -}; - -exports.InputRule = InputRule; - -var InputRules = (function () { - function InputRules(pm) { - var _this = this; - - _classCallCheck(this, InputRules); - - this.pm = pm; - this.rules = []; - this.cancelVersion = null; - - pm.on("selectionChange", this.onSelChange = function () { - return _this.cancelVersion = null; - }); - pm.on("textInput", this.onTextInput = this.onTextInput.bind(this)); - pm.addKeymap(new _edit.Keymap({ Backspace: function Backspace(pm) { - return _this.backspace(pm); - } }, { name: "inputRules" }), 20); - } - - _createClass(InputRules, [{ - key: "unregister", - value: function unregister() { - this.pm.off("selectionChange", this.onSelChange); - this.pm.off("textInput", this.onTextInput); - this.pm.removeKeymap("inputRules"); - } - }, { - key: "addRule", - value: function addRule(rule) { - this.rules.push(rule); - } - }, { - key: "removeRule", - value: function removeRule(name) { - for (var i = 0; i < this.rules.length; i++) { - if (this.rules[i].name == name) { - this.rules.splice(i, 1); - return true; - } - } - } - }, { - key: "onTextInput", - value: function onTextInput(text) { - var pos = this.pm.selection.head; - if (!pos) return; - - var textBefore = undefined, - isCode = undefined; - var lastCh = text[text.length - 1]; - - for (var i = 0; i < this.rules.length; i++) { - var rule = this.rules[i], - match = undefined; - if (rule.filter && rule.filter != lastCh) continue; - if (textBefore == null) { - ; - var _getContext = getContext(this.pm.doc, pos); - - textBefore = _getContext.textBefore; - isCode = _getContext.isCode; - - if (isCode) return; - } - if (match = rule.match.exec(textBefore)) { - var startVersion = this.pm.history.getVersion(); - if (typeof rule.handler == "string") { - var offset = pos.offset - (match[1] || match[0]).length; - var start = new _model.Pos(pos.path, offset); - var marks = this.pm.doc.marksAt(pos); - this.pm.tr["delete"](start, pos).insert(start, this.pm.schema.text(rule.handler, marks)).apply(); - } else { - rule.handler(this.pm, match, pos); - } - this.cancelVersion = startVersion; - return; - } - } - } - }, { - key: "backspace", - value: function backspace() { - if (this.cancelVersion) { - this.pm.history.backToVersion(this.cancelVersion); - this.cancelVersion = null; - } else { - return false; - } - } - }]); - - return InputRules; -})(); - -function getContext(doc, pos) { - var parent = doc.path(pos.path); - var isCode = parent.type.isCode; - var textBefore = ""; - for (var i = parent.iter(0, pos.offset), child = undefined; child = i.next().value;) { - if (child.isText) textBefore += child.text;else textBefore = ""; - if (i.atEnd() && child.marks.some(function (st) { - return st.type.isCode; - })) isCode = true; - } - return { textBefore: textBefore, isCode: isCode }; -} - -},{"../edit":9,"../model":27}],18:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.getIcon = getIcon; - -var _dom = require("../dom"); - -var svgCollection = null; -var svgBuilt = Object.create(null); - -var SVG = "http://www.w3.org/2000/svg"; -var XLINK = "http://www.w3.org/1999/xlink"; - -function getIcon(name, data) { - var node = document.createElement("div"); - node.className = "ProseMirror-icon"; - if (data.path) { - if (!svgBuilt[name]) buildSVG(name, data); - var svg = node.appendChild(document.createElementNS(SVG, "svg")); - svg.style.width = data.width / data.height + "em"; - var use = svg.appendChild(document.createElementNS(SVG, "use")); - use.setAttributeNS(XLINK, "href", "#pm-icon-" + name); - } else { - node.textContent = data.text; - if (data.css) node.style.cssText = data.css; - } - return node; -} - -function buildSVG(name, data) { - if (!svgCollection) { - svgCollection = document.createElementNS(SVG, "svg"); - svgCollection.style.display = "none"; - document.body.insertBefore(svgCollection, document.body.firstChild); - } - var sym = document.createElementNS(SVG, "symbol"); - sym.id = "pm-icon-" + name; - sym.setAttribute("viewBox", "0 0 " + data.width + " " + data.height); - var path = sym.appendChild(document.createElementNS(SVG, "path")); - path.setAttribute("d", data.path); - svgCollection.appendChild(sym); - svgBuilt[name] = true; -} - -(0, _dom.insertCSS)("\n.ProseMirror-icon {\n display: inline-block;\n line-height: .8;\n vertical-align: middle;\n padding: 2px 8px;\n cursor: pointer;\n}\n\n.ProseMirror-icon-active {\n background: #666;\n border-radius: 4px;\n}\n\n.ProseMirror-icon svg {\n fill: currentColor;\n height: 1em;\n}\n"); - -},{"../dom":1}],19:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = (function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); - } - }return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; - }; -})(); - -exports.showSelectMenu = showSelectMenu; -exports.readParams = readParams; -exports.commandGroups = commandGroups; - -function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { "default": obj }; -} - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -var _tooltip = require("./tooltip"); - -var _dom = require("../dom"); - -var _edit = require("../edit"); - -var _utilSortedinsert = require("../util/sortedinsert"); - -var _utilSortedinsert2 = _interopRequireDefault(_utilSortedinsert); - -var _icons = require("./icons"); - -var Menu = (function () { - function Menu(pm, display) { - _classCallCheck(this, Menu); - - this.display = display; - this.stack = []; - this.pm = pm; - } - - _createClass(Menu, [{ - key: "show", - value: function show(content, displayInfo) { - this.stack.length = 0; - this.enter(content, displayInfo); - } - }, { - key: "reset", - value: function reset() { - this.stack.length = 0; - this.display.reset(); - } - }, { - key: "enter", - value: function enter(content, displayInfo) { - var _this = this; - - var pieces = [], - explore = function explore(value) { - if (Array.isArray(value)) { - for (var i = 0; i < value.length; i++) { - explore(value[i]); - }pieces.push(separator); - } else if (!value.select || value.select(_this.pm)) { - pieces.push(value); - } - }; - explore(content); - // Remove superfluous separators - for (var i = 0; i < pieces.length; i++) { - if (pieces[i] == separator && (i == 0 || i == pieces.length - 1 || pieces[i + 1] == separator)) pieces.splice(i--, 1); - }if (!pieces.length) return this.display.clear(); - - this.stack.push(pieces); - this.draw(displayInfo); - } - }, { - key: "draw", - value: function draw(displayInfo) { - var _this2 = this; - - var cur = this.stack[this.stack.length - 1]; - var rendered = (0, _dom.elt)("div", { "class": "ProseMirror-menu" }, cur.map(function (item) { - return renderItem(item, _this2); - })); - if (this.stack.length > 1) this.display.enter(rendered, function () { - return _this2.leave(); - }, displayInfo);else this.display.show(rendered, displayInfo); - } - }, { - key: "leave", - value: function leave() { - this.stack.pop(); - if (this.stack.length) this.draw();else this.display.reset(); - } - }, { - key: "active", - get: function get() { - return this.stack.length > 1; - } - }]); - - return Menu; -})(); - -exports.Menu = Menu; - -var TooltipDisplay = (function () { - function TooltipDisplay(tooltip, resetFunc) { - _classCallCheck(this, TooltipDisplay); - - this.tooltip = tooltip; - this.resetFunc = resetFunc; - } - - _createClass(TooltipDisplay, [{ - key: "clear", - value: function clear() { - this.tooltip.close(); - } - }, { - key: "reset", - value: function reset() { - if (this.resetFunc) this.resetFunc();else this.clear(); - } - }, { - key: "show", - value: function show(dom, info) { - this.tooltip.open(dom, info); - } - }, { - key: "enter", - value: function enter(dom, back, info) { - var button = (0, _dom.elt)("div", { "class": "ProseMirror-tooltip-back", title: "Back" }); - button.addEventListener("mousedown", function (e) { - e.preventDefault();e.stopPropagation(); - back(); - }); - this.show((0, _dom.elt)("div", { "class": "ProseMirror-tooltip-back-wrapper" }, dom, button), info); - } - }]); - - return TooltipDisplay; -})(); - -exports.TooltipDisplay = TooltipDisplay; - -function title(pm, command) { - var key = pm.keyForCommand(command.name); - return key ? command.label + " (" + key + ")" : command.label; -} - -function renderIcon(command, menu) { - var icon = resolveIcon(menu.pm, command); - if (command.active(menu.pm)) icon.className += " ProseMirror-icon-active"; - var dom = (0, _dom.elt)("span", { "class": "ProseMirror-menuicon", title: title(menu.pm, command) }, icon); - dom.addEventListener("mousedown", function (e) { - e.preventDefault();e.stopPropagation(); - if (!command.params.length) { - command.exec(menu.pm); - menu.reset(); - } else if (command.params.length == 1 && command.params[0].type == "select") { - showSelectMenu(menu.pm, command, dom); - } else { - menu.enter(readParams(command)); - } - }); - return dom; -} - -function resolveIcon(pm, command) { - for (;;) { - var icon = command.spec.icon; - if (!icon) break; - if (icon.from) { - command = pm.commands[icon.from]; - if (!command) break; - } else { - return (0, _icons.getIcon)(command.name, icon); - } - } - return (0, _icons.getIcon)("default", { text: "✘" }); -} - -function renderSelect(item, menu) { - var param = item.params[0]; - var value = !param["default"] ? null : param["default"].call ? param["default"](menu.pm) : param["default"]; - - var dom = (0, _dom.elt)("div", { "class": "ProseMirror-select ProseMirror-select-command-" + item.name, title: item.label }, !value ? param.defaultLabel || "Select..." : value.display ? value.display(value) : value.label); - dom.addEventListener("mousedown", function (e) { - e.preventDefault();e.stopPropagation(); - showSelectMenu(menu.pm, item, dom); - }); - return dom; -} - -function showSelectMenu(pm, item, dom) { - var param = item.params[0]; - var options = param.options.call ? param.options(pm) : param.options; - var menu = (0, _dom.elt)("div", { "class": "ProseMirror-select-menu" }, options.map(function (o) { - var dom = (0, _dom.elt)("div", null, o.display ? o.display(o) : o.label); - dom.addEventListener("mousedown", function (e) { - e.preventDefault(); - item.exec(pm, [o.value]); - finish(); - }); - return dom; - })); - var pos = dom.getBoundingClientRect(), - box = pm.wrapper.getBoundingClientRect(); - menu.style.left = pos.left - box.left - 2 + "px"; - menu.style.top = pos.top - box.top - 2 + "px"; - - var done = false; - function finish() { - if (done) return; - done = true; - document.body.removeEventListener("mousedown", finish); - document.body.removeEventListener("keydown", finish); - pm.wrapper.removeChild(menu); - } - document.body.addEventListener("mousedown", finish); - document.body.addEventListener("keydown", finish); - pm.wrapper.appendChild(menu); -} - -function renderItem(item, menu) { - var display = item.display || item.spec.display || "icon"; - if (display == "icon") return renderIcon(item, menu);else if (display == "select") return renderSelect(item, menu);else if (!display) throw new Error("Command " + item.name + " can not be shown in a menu");else return display.call(item, menu); -} - -function buildParamForm(pm, command) { - var prefill = command.spec.prefillParams && command.spec.prefillParams(pm); - var fields = command.params.map(function (param, i) { - var field = undefined, - name = "field_" + i; - var val = prefill ? prefill[i] : param["default"] || ""; - if (param.type == "text") field = (0, _dom.elt)("input", { name: name, type: "text", - placeholder: param.label, - value: val, - autocomplete: "off" });else if (param.type == "select") field = (0, _dom.elt)("select", { name: name }, (param.options.call ? param.options(pm) : param.options).map(function (o) { - return (0, _dom.elt)("option", { value: o.value, selected: o.value == val }, o.label); - }));else // FIXME more types - throw new Error("Unsupported parameter type: " + param.type); - return (0, _dom.elt)("div", null, field); - }); - return (0, _dom.elt)("form", null, fields); -} - -function gatherParams(pm, command, form) { - var bad = false; - var params = command.params.map(function (param, i) { - var val = form.elements["field_" + i].value; - if (val) return val; - if (param["default"] == null) bad = true;else return param["default"].call ? param["default"](pm) : param["default"]; - }); - return bad ? null : params; -} - -function paramForm(pm, command, callback) { - var form = buildParamForm(pm, command), - done = false; - - var finish = function finish(result) { - if (!done) { - done = true; - callback(result); - } - }; - - var submit = function submit() { - // FIXME error messages - finish(gatherParams(pm, command, form)); - }; - form.addEventListener("submit", function (e) { - e.preventDefault(); - submit(); - }); - form.addEventListener("keydown", function (e) { - if (e.keyCode == 27) { - finish(null); - } else if (e.keyCode == 13 && !(e.ctrlKey || e.metaKey || e.shiftKey)) { - e.preventDefault(); - submit(); - } - }); - // FIXME too hacky? - setTimeout(function () { - var input = form.querySelector("input, textarea"); - if (input) input.focus(); - }, 20); - - return form; -} - -function readParams(command) { - return { display: function display(menu) { - return paramForm(menu.pm, command, function (params) { - menu.pm.focus(); - if (params) { - command.exec(menu.pm, params); - menu.reset(); - } else { - menu.leave(); - } - }); - } }; -} - -var separator = { - display: function display() { - return (0, _dom.elt)("div", { "class": "ProseMirror-menuseparator" }); - } -}; - -function commandGroups(pm) { - for (var _len = arguments.length, names = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - names[_key - 1] = arguments[_key]; - } - - return names.map(function (group) { - var found = []; - for (var _name in pm.commands) { - var cmd = pm.commands[_name]; - if (cmd.spec.menuGroup && cmd.spec.menuGroup == group) (0, _utilSortedinsert2["default"])(found, cmd, function (a, b) { - return (a.spec.menuRank || 50) - (b.spec.menuRank || 50); - }); - } - return found; - }); -} - -function tooltipParamHandler(pm, command, callback) { - var tooltip = new _tooltip.Tooltip(pm, "center"); - tooltip.open(paramForm(pm, command, function (params) { - pm.focus(); - tooltip.close(); - callback(params); - })); -} - -(0, _edit.defineParamHandler)("default", tooltipParamHandler); -(0, _edit.defineParamHandler)("tooltip", tooltipParamHandler); - -// FIXME check for obsolete styles -(0, _dom.insertCSS)("\n\n.ProseMirror-menu {\n margin: 0 -4px;\n line-height: 1;\n white-space: pre;\n}\n.ProseMirror-tooltip .ProseMirror-menu {\n width: -webkit-fit-content;\n width: fit-content;\n}\n\n.ProseMirror-tooltip-back-wrapper {\n padding-left: 12px;\n}\n.ProseMirror-tooltip-back {\n position: absolute;\n top: 5px; left: 5px;\n cursor: pointer;\n}\n.ProseMirror-tooltip-back:after {\n content: \"«\";\n}\n\n.ProseMirror-menuicon {\n margin: 0 7px;\n}\n\n.ProseMirror-menuseparator {\n display: inline-block;\n}\n.ProseMirror-menuseparator:after {\n content: \"︙\";\n opacity: 0.5;\n padding: 0 4px;\n vertical-align: baseline;\n}\n\n.ProseMirror-select, .ProseMirror-select-menu {\n border: 1px solid #777;\n border-radius: 3px;\n font-size: 90%;\n}\n\n.ProseMirror-select {\n padding: 1px 12px 1px 4px;\n display: inline-block;\n vertical-align: middle;\n position: relative;\n cursor: pointer;\n margin: 0 8px;\n}\n\n.ProseMirror-select-command-textblockType {\n min-width: 3.2em;\n}\n\n.ProseMirror-select:after {\n content: \"▿\";\n color: #777;\n position: absolute;\n right: 4px;\n}\n\n.ProseMirror-select-menu {\n position: absolute;\n background: #444;\n color: white;\n padding: 2px 2px;\n z-index: 15;\n}\n.ProseMirror-select-menu div {\n cursor: pointer;\n padding: 0 1em 0 2px;\n}\n.ProseMirror-select-menu div:hover {\n background: #777;\n}\n\n"); - -},{"../dom":1,"../edit":9,"../util/sortedinsert":51,"./icons":18,"./tooltip":21}],20:[function(require,module,exports){ -"use strict"; - -var _createClass = (function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); - } - }return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; - }; -})(); - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -var _edit = require("../edit"); - -var _dom = require("../dom"); - -var _update = require("./update"); - -var _menu = require("./menu"); - -(0, _edit.defineOption)("menuBar", false, function (pm, value) { - if (pm.mod.menuBar) pm.mod.menuBar.detach(); - pm.mod.menuBar = value ? new MenuBar(pm, value) : null; -}); - -var BarDisplay = (function () { - function BarDisplay(container, resetFunc) { - _classCallCheck(this, BarDisplay); - - this.container = container; - this.resetFunc = resetFunc; - } - - _createClass(BarDisplay, [{ - key: "clear", - value: function clear() { - this.container.textContent = ""; - } - }, { - key: "reset", - value: function reset() { - this.resetFunc(); - } - }, { - key: "show", - value: function show(dom) { - this.clear(); - this.container.appendChild(dom); - } - }, { - key: "enter", - value: function enter(dom, back) { - var current = this.container.firstChild; - if (current) { - current.style.position = "absolute"; - current.style.opacity = "0.5"; - } - var backButton = (0, _dom.elt)("div", { "class": "ProseMirror-menubar-back" }); - backButton.addEventListener("mousedown", function (e) { - e.preventDefault();e.stopPropagation(); - back(); - }); - var added = (0, _dom.elt)("div", { "class": "ProseMirror-menubar-sliding" }, backButton, dom); - this.container.appendChild(added); - added.getBoundingClientRect(); // Force layout for transition - added.style.left = "0"; - added.addEventListener("transitionend", function () { - if (current && current.parentNode) current.parentNode.removeChild(current); - }); - } - }]); - - return BarDisplay; -})(); - -var MenuBar = (function () { - function MenuBar(pm, config) { - var _this = this; - - _classCallCheck(this, MenuBar); - - this.pm = pm; - - this.menuElt = (0, _dom.elt)("div", { "class": "ProseMirror-menubar-inner" }); - this.wrapper = (0, _dom.elt)("div", { "class": "ProseMirror-menubar" }, (0, _dom.elt)("div", { "class": "ProseMirror-menu", style: "visibility: hiffdden; z-index: 100" }, (0, _dom.elt)("span", { "class": "ProseMirror-menuicon" }, (0, _dom.elt)("div", { "class": "ProseMirror-icon" }, "x"))), this.menuElt); - pm.wrapper.insertBefore(this.wrapper, pm.wrapper.firstChild); - - this.update = new _update.MenuUpdate(pm, "selectionChange change activeMarkChange", function () { - return _this.prepareUpdate(); - }); - this.menu = new _menu.Menu(pm, new BarDisplay(this.menuElt, function () { - return _this.resetMenu(); - })); - - this.menuItems = config && config.items || (0, _menu.commandGroups)(pm, "inline", "block", "history"); - this.update.force(); - - this.floating = false; - if (config && config.float) { - this.updateFloat(); - this.scrollFunc = function () { - if (!document.body.contains(_this.pm.wrapper)) window.removeEventListener("scroll", _this.scrollFunc);else _this.updateFloat(); - }; - window.addEventListener("scroll", this.scrollFunc); - } - } - - _createClass(MenuBar, [{ - key: "detach", - value: function detach() { - this.update.detach(); - this.wrapper.parentNode.removeChild(this.wrapper); - - if (this.scrollFunc) window.removeEventListener("scroll", this.scrollFunc); - } - }, { - key: "prepareUpdate", - value: function prepareUpdate() { - var _this2 = this; - - var scrollCursor = this.prepareScrollCursor(); - return function () { - if (!_this2.menu.active) _this2.resetMenu(); - if (scrollCursor) scrollCursor(); - }; - } - }, { - key: "resetMenu", - value: function resetMenu() { - this.menu.show(this.menuItems); - } - }, { - key: "updateFloat", - value: function updateFloat() { - var editorRect = this.pm.wrapper.getBoundingClientRect(); - if (this.floating) { - if (editorRect.top >= 0 || editorRect.bottom < this.menuElt.offsetHeight + 10) { - this.floating = false; - this.menuElt.style.position = this.menuElt.style.left = this.menuElt.style.width = ""; - this.menuElt.style.display = ""; - } else { - var border = (this.pm.wrapper.offsetWidth - this.pm.wrapper.clientWidth) / 2; - this.menuElt.style.left = editorRect.left + border + "px"; - this.menuElt.style.display = editorRect.top > window.innerHeight ? "none" : ""; - } - } else { - if (editorRect.top < 0 && editorRect.bottom >= this.menuElt.offsetHeight + 10) { - this.floating = true; - var menuRect = this.menuElt.getBoundingClientRect(); - this.menuElt.style.left = menuRect.left + "px"; - this.menuElt.style.width = menuRect.width + "px"; - this.menuElt.style.position = "fixed"; - } - } - } - }, { - key: "prepareScrollCursor", - value: function prepareScrollCursor() { - var _this3 = this; - - if (!this.floating) return null; - var head = this.pm.selection.head; - if (!head) return null; - var cursorPos = this.pm.coordsAtPos(head); - var menuRect = this.menuElt.getBoundingClientRect(); - if (cursorPos.top < menuRect.bottom && cursorPos.bottom > menuRect.top) { - var _ret = (function () { - var scrollable = findWrappingScrollable(_this3.pm.wrapper); - if (scrollable) return { - v: function v() { - return scrollable.scrollTop -= menuRect.bottom - cursorPos.top; - } - }; - })(); - - if (typeof _ret === "object") return _ret.v; - } - } - }]); - - return MenuBar; -})(); - -function findWrappingScrollable(node) { - for (var cur = node.parentNode; cur; cur = cur.parentNode) { - if (cur.scrollHeight > cur.clientHeight) return cur; - } -} - -(0, _dom.insertCSS)("\n.ProseMirror-menubar {\n position: relative;\n margin-bottom: 3px;\n border-top-left-radius: inherit;\n border-top-right-radius: inherit;\n}\n\n.ProseMirror-menubar-inner {\n color: #666;\n padding: 1px 6px;\n top: 0; left: 0; right: 0;\n position: absolute;\n border-bottom: 1px solid silver;\n background: white;\n z-index: 10;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n overflow: hidden;\n border-top-left-radius: inherit;\n border-top-right-radius: inherit;\n}\n\n.ProseMirror-menubar .ProseMirror-icon-active {\n background: #eee;\n}\n\n.ProseMirror-menubar input[type=\"text\"],\n.ProseMirror-menubar textarea {\n background: #eee;\n color: black;\n border: none;\n outline: none;\n width: 100%;\n box-sizing: -moz-border-box;\n box-sizing: border-box;\n}\n\n.ProseMirror-menubar input[type=\"text\"] {\n padding: 0 4px;\n}\n\n.ProseMirror-menubar form {\n position: relative;\n padding: 2px 4px;\n}\n\n.ProseMirror-menubar .ProseMirror-blocktype {\n border: 1px solid #ccc;\n min-width: 4em;\n}\n.ProseMirror-menubar .ProseMirror-blocktype:after {\n color: #ccc;\n}\n\n.ProseMirror-menubar-sliding {\n -webkit-transition: left 0.2s ease-out;\n -moz-transition: left 0.2s ease-out;\n transition: left 0.2s ease-out;\n position: relative;\n left: 100%;\n width: 100%;\n box-sizing: -moz-border-box;\n box-sizing: border-box;\n padding-left: 16px;\n background: white;\n}\n\n.ProseMirror-menubar-back {\n position: absolute;\n height: 100%;\n margin-top: -1px;\n padding-bottom: 2px;\n width: 10px;\n left: 0;\n border-right: 1px solid silver;\n cursor: pointer;\n}\n.ProseMirror-menubar-back:after {\n content: \"«\";\n}\n\n"); - -},{"../dom":1,"../edit":9,"./menu":19,"./update":23}],21:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = (function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); - } - }return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; - }; -})(); - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -var _dom = require("../dom"); - -var prefix = "ProseMirror-tooltip"; - -var Tooltip = (function () { - function Tooltip(pm, dir) { - var _this = this; - - _classCallCheck(this, Tooltip); - - this.pm = pm; - this.dir = dir || "above"; - this.pointer = pm.wrapper.appendChild((0, _dom.elt)("div", { "class": prefix + "-pointer-" + this.dir + " " + prefix + "-pointer" })); - this.pointerWidth = this.pointerHeight = null; - this.dom = pm.wrapper.appendChild((0, _dom.elt)("div", { "class": prefix })); - this.dom.addEventListener("transitionend", function () { - if (_this.dom.style.opacity == "0") _this.dom.style.display = _this.pointer.style.display = ""; - }); - - this.isOpen = false; - this.lastLeft = this.lastRight = null; - } - - _createClass(Tooltip, [{ - key: "detach", - value: function detach() { - this.dom.parentNode.removeChild(this.dom); - this.pointer.parentNode.removeChild(this.pointer); - } - }, { - key: "getSize", - value: function getSize(node) { - var wrap = this.pm.wrapper.appendChild((0, _dom.elt)("div", { - "class": prefix, - style: "display: block; position: absolute" - }, node)); - var size = { width: wrap.offsetWidth, height: wrap.offsetHeight }; - wrap.parentNode.removeChild(wrap); - return size; - } - }, { - key: "open", - value: function open(node, pos) { - var left = this.lastLeft = pos ? pos.left : this.lastLeft; - var top = this.lastTop = pos ? pos.top : this.lastTop; - - var size = this.getSize(node); - - var around = this.pm.wrapper.getBoundingClientRect(); - - for (var child = this.dom.firstChild, next = undefined; child; child = next) { - next = child.nextSibling; - if (child != this.pointer) this.dom.removeChild(child); - } - this.dom.appendChild(node); - - this.dom.style.display = this.pointer.style.display = "block"; - - if (this.pointerWidth == null) { - this.pointerWidth = this.pointer.offsetWidth - 1; - this.pointerHeight = this.pointer.offsetHeight - 1; - } - - this.dom.style.width = size.width + "px"; - this.dom.style.height = size.height + "px"; - - var margin = 5; - if (this.dir == "above" || this.dir == "below") { - var tipLeft = Math.max(0, Math.min(left - size.width / 2, window.innerWidth - size.width)); - this.dom.style.left = tipLeft - around.left + "px"; - this.pointer.style.left = left - around.left - this.pointerWidth / 2 + "px"; - if (this.dir == "above") { - var tipTop = top - around.top - margin - this.pointerHeight - size.height; - this.dom.style.top = tipTop + "px"; - this.pointer.style.top = tipTop + size.height + "px"; - } else { - // below - var tipTop = top - around.top + margin; - this.pointer.style.top = tipTop + "px"; - this.dom.style.top = tipTop + this.pointerHeight + "px"; - } - } else if (this.dir == "left" || this.dir == "right") { - this.dom.style.top = top - around.top - size.height / 2 + "px"; - this.pointer.style.top = top - this.pointerHeight / 2 - around.top + "px"; - if (this.dir == "left") { - var pointerLeft = left - around.left - margin - this.pointerWidth; - this.dom.style.left = pointerLeft - size.width + "px"; - this.pointer.style.left = pointerLeft + "px"; - } else { - // right - var pointerLeft = left - around.left + margin; - this.dom.style.left = pointerLeft + this.pointerWidth + "px"; - this.pointer.style.left = pointerLeft + "px"; - } - } else if (this.dir == "center") { - var _top = Math.max(around.top, 0), - bottom = Math.min(around.bottom, window.innerHeight); - var fromTop = (bottom - _top - size.height) / 2; - this.dom.style.left = (around.width - size.width) / 2 + "px"; - this.dom.style.top = _top - around.top + fromTop + "px"; - } - - getComputedStyle(this.dom).opacity; - getComputedStyle(this.pointer).opacity; - this.dom.style.opacity = this.pointer.style.opacity = 1; - this.isOpen = true; - } - }, { - key: "close", - value: function close() { - if (this.isOpen) { - this.isOpen = false; - this.dom.style.opacity = this.pointer.style.opacity = 0; - } - } - }]); - - return Tooltip; -})(); - -exports.Tooltip = Tooltip; - -(0, _dom.insertCSS)("\n\n.ProseMirror-tooltip {\n position: absolute;\n display: none;\n box-sizing: border-box;\n -moz-box-sizing: border- box;\n overflow: hidden;\n\n -webkit-transition: width 0.4s ease-out, height 0.4s ease-out, left 0.4s ease-out, top 0.4s ease-out, opacity 0.2s;\n -moz-transition: width 0.4s ease-out, height 0.4s ease-out, left 0.4s ease-out, top 0.4s ease-out, opacity 0.2s;\n transition: width 0.4s ease-out, height 0.4s ease-out, left 0.4s ease-out, top 0.4s ease-out, opacity 0.2s;\n opacity: 0;\n\n border-radius: 5px;\n padding: 3px 7px;\n margin: 0;\n background: #444;\n border-color: #777;\n color: white;\n\n z-index: 5;\n}\n\n.ProseMirror-tooltip-pointer {\n content: \"\";\n position: absolute;\n display: none;\n width: 0; height: 0;\n\n -webkit-transition: left 0.4s ease-out, top 0.4s ease-out, opacity 0.2s;\n -moz-transition: left 0.4s ease-out, top 0.4s ease-out, opacity 0.2s;\n transition: left 0.4s ease-out, top 0.4s ease-out, opacity 0.2s;\n opacity: 0;\n\n z-index: 10;\n}\n\n.ProseMirror-tooltip-pointer-above {\n border-left: 6px solid transparent;\n border-right: 6px solid transparent;\n border-top: 6px solid #444;\n}\n\n.ProseMirror-tooltip-pointer-below {\n border-left: 6px solid transparent;\n border-right: 6px solid transparent;\n border-bottom: 6px solid #444;\n}\n\n.ProseMirror-tooltip-pointer-right {\n border-top: 6px solid transparent;\n border-bottom: 6px solid transparent;\n border-right: 6px solid #444;\n}\n\n.ProseMirror-tooltip-pointer-left {\n border-top: 6px solid transparent;\n border-bottom: 6px solid transparent;\n border-left: 6px solid #444;\n}\n\n.ProseMirror-tooltip input[type=\"text\"],\n.ProseMirror-tooltip textarea {\n background: #666;\n color: white;\n border: none;\n outline: none;\n}\n\n.ProseMirror-tooltip input[type=\"text\"] {\n padding: 0 4px;\n}\n\n"); - -},{"../dom":1}],22:[function(require,module,exports){ -"use strict"; - -var _createClass = (function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); - } - }return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; - }; -})(); - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -var _model = require("../model"); - -var _edit = require("../edit"); - -var _dom = require("../dom"); - -var _update = require("./update"); - -var _tooltip = require("./tooltip"); - -var _menu = require("./menu"); - -var classPrefix = "ProseMirror-tooltipmenu"; - -(0, _edit.defineOption)("tooltipMenu", false, function (pm, value) { - if (pm.mod.tooltipMenu) pm.mod.tooltipMenu.detach(); - pm.mod.tooltipMenu = value ? new TooltipMenu(pm, value) : null; -}); - -var TooltipMenu = (function () { - function TooltipMenu(pm, config) { - var _this = this; - - _classCallCheck(this, TooltipMenu); - - this.pm = pm; - this.inlineItems = config && config.inlineItems || (0, _menu.commandGroups)(pm, "inline"); - this.blockItems = config && config.blockItems || (0, _menu.commandGroups)(pm, "block"); - this.showLinks = config ? config.showLinks !== false : true; - this.selectedBlockMenu = config && config.selectedBlockMenu; - this.update = new _update.MenuUpdate(pm, "change selectionChange blur", function () { - return _this.prepareUpdate(); - }); - - this.tooltip = new _tooltip.Tooltip(pm, "above"); - this.menu = new _menu.Menu(pm, new _menu.TooltipDisplay(this.tooltip, function () { - return _this.update.force(); - })); - } - - /** - * Get the x and y coordinates at the top center of the current DOM selection. - * - * @return {Object} - */ - - _createClass(TooltipMenu, [{ - key: "detach", - value: function detach() { - this.update.detach(); - this.tooltip.detach(); - } - }, { - key: "prepareUpdate", - value: function prepareUpdate() { - var _this2 = this; - - if (this.menu.active) return null; - - var _pm$selection = this.pm.selection; - var empty = _pm$selection.empty; - var node = _pm$selection.node; - var from = _pm$selection.from; - var to = _pm$selection.to;var link = undefined; - if (!this.pm.hasFocus()) { - return function () { - return _this2.tooltip.close(); - }; - } else if (node && node.isBlock) { - var _ret = (function () { - var coords = topOfNodeSelection(_this2.pm); - return { - v: function v() { - return _this2.menu.show(_this2.blockItems, coords); - } - }; - })(); - - if (typeof _ret === "object") return _ret.v; - } else if (!empty) { - var _ret2 = (function () { - var coords = node ? topOfNodeSelection(_this2.pm) : topCenterOfSelection(); - var showBlock = _this2.selectedBlockMenu && _model.Pos.samePath(from.path, to.path) && from.offset == 0 && to.offset == _this2.pm.doc.path(from.path).size; - return { - v: function v() { - return _this2.menu.show(showBlock ? [_this2.inlineItems, _this2.blockItems] : _this2.inlineItems, coords); - } - }; - })(); - - if (typeof _ret2 === "object") return _ret2.v; - } else if (this.selectedBlockMenu && this.pm.doc.path(from.path).size == 0) { - var _ret3 = (function () { - var coords = _this2.pm.coordsAtPos(from); - return { - v: function v() { - return _this2.menu.show(_this2.blockItems, coords); - } - }; - })(); - - if (typeof _ret3 === "object") return _ret3.v; - } else if (this.showLinks && (link = this.linkUnderCursor())) { - var _ret4 = (function () { - var coords = _this2.pm.coordsAtPos(from); - return { - v: function v() { - return _this2.showLink(link, coords); - } - }; - })(); - - if (typeof _ret4 === "object") return _ret4.v; - } else { - return function () { - return _this2.tooltip.close(); - }; - } - } - }, { - key: "linkUnderCursor", - value: function linkUnderCursor() { - var head = this.pm.selection.head; - if (!head) return null; - var marks = this.pm.doc.marksAt(head); - return marks.reduce(function (found, m) { - return found || m.type.name == "link" && m; - }, null); - } - }, { - key: "showLink", - value: function showLink(link, pos) { - var node = (0, _dom.elt)("div", { "class": classPrefix + "-linktext" }, (0, _dom.elt)("a", { href: link.attrs.href, title: link.attrs.title }, link.attrs.href)); - this.tooltip.open(node, pos); - } - }]); - - return TooltipMenu; -})(); - -function topCenterOfSelection() { - var rects = window.getSelection().getRangeAt(0).getClientRects(); - var _rects$0 = rects[0]; - var left = _rects$0.left; - var right = _rects$0.right; - var top = _rects$0.top;var i = 1; - while (left == right && rects.length > i) { - ;var _rects = rects[i++]; - left = _rects.left; - right = _rects.right; - top = _rects.top; - } - for (; i < rects.length; i++) { - if (rects[i].top < rects[0].bottom - 1 && ( - // Chrome bug where bogus rectangles are inserted at span boundaries - i == rects.length - 1 || Math.abs(rects[i + 1].left - rects[i].left) > 1)) { - left = Math.min(left, rects[i].left); - right = Math.max(right, rects[i].right); - top = Math.min(top, rects[i].top); - } - } - return { top: top, left: (left + right) / 2 }; -} - -function topOfNodeSelection(pm) { - var selected = pm.content.querySelector(".ProseMirror-selectednode"); - if (!selected) return { left: 0, top: 0 }; - var box = selected.getBoundingClientRect(); - return { left: Math.min((box.left + box.right) / 2, box.left + 20), top: box.top }; -} - -(0, _dom.insertCSS)("\n\n.ProseMirror-tooltipmenu-linktext a {\n color: white;\n text-decoration: none;\n padding: 0 5px;\n}\n\n.ProseMirror-tooltipmenu-linktext a:hover {\n text-decoration: underline;\n}\n\n"); - -},{"../dom":1,"../edit":9,"../model":27,"./menu":19,"./tooltip":21,"./update":23}],23:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = (function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); - } - }return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; - }; -})(); - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -var MIN_FLUSH_DELAY = 200; -var UPDATE_TIMEOUT = 200; - -var MenuUpdate = (function () { - function MenuUpdate(pm, events, prepare) { - var _this = this; - - _classCallCheck(this, MenuUpdate); - - this.pm = pm; - this.prepare = prepare; - - this.mustUpdate = false; - this.updateInfo = null; - this.timeout = null; - this.lastFlush = 0; - - this.events = events.split(" "); - this.onEvent = this.onEvent.bind(this); - this.force = this.force.bind(this); - this.events.forEach(function (event) { - return pm.on(event, _this.onEvent); - }); - pm.on("flush", this.onFlush = this.onFlush.bind(this)); - pm.on("flushed", this.onFlushed = this.onFlushed.bind(this)); - } - - _createClass(MenuUpdate, [{ - key: "detach", - value: function detach() { - var _this2 = this; - - clearTimeout(this.timeout); - this.events.forEach(function (event) { - return _this2.pm.off(event, _this2.onEvent); - }); - this.pm.off("flush", this.onFlush); - this.pm.off("flushed", this.onFlushed); - } - }, { - key: "onFlush", - value: function onFlush() { - var now = Date.now(); - if (this.mustUpdate && now - this.lastFlush >= MIN_FLUSH_DELAY) { - this.lastFlush = now; - clearTimeout(this.timeout); - this.mustUpdate = false; - this.update = this.prepare(); - } - } - }, { - key: "onFlushed", - value: function onFlushed() { - if (this.update) { - this.update(); - this.update = null; - } - } - }, { - key: "onEvent", - value: function onEvent() { - this.mustUpdate = true; - clearTimeout(this.timeout); - this.timeout = setTimeout(this.force, UPDATE_TIMEOUT); - } - }, { - key: "force", - value: function force() { - if (this.pm.operation) { - this.onEvent(); - } else { - this.mustUpdate = false; - this.updateInfo = null; - this.lastFlush = Date.now(); - clearTimeout(this.timeout); - var update = this.prepare(); - if (update) update(); - } - } - }]); - - return MenuUpdate; -})(); - -exports.MenuUpdate = MenuUpdate; - -},{}],24:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = (function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); - } - }return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; - }; -})(); - -var _get = function get(_x, _x2, _x3) { - var _again = true;_function: while (_again) { - var object = _x, - property = _x2, - receiver = _x3;_again = false;if (object === null) object = Function.prototype;var desc = Object.getOwnPropertyDescriptor(object, property);if (desc === undefined) { - var parent = Object.getPrototypeOf(object);if (parent === null) { - return undefined; - } else { - _x = parent;_x2 = property;_x3 = receiver;_again = true;desc = parent = undefined;continue _function; - } - } else if ("value" in desc) { - return desc.value; - } else { - var getter = desc.get;if (getter === undefined) { - return undefined; - }return getter.call(receiver); - } - } -}; - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -function _inherits(subClass, superClass) { - if (typeof superClass !== "function" && superClass !== null) { - throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); - }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; -} - -var _schema = require("./schema"); - -// ;; #toc="Default schema" The default top-level document node type. - -var Doc = (function (_Block) { - _inherits(Doc, _Block); - - function Doc() { - _classCallCheck(this, Doc); - - _get(Object.getPrototypeOf(Doc.prototype), "constructor", this).apply(this, arguments); - } - - // ;; #toc=false The default blockquote node type. - - _createClass(Doc, null, [{ - key: "kind", - get: function get() { - return "."; - } - }]); - - return Doc; -})(_schema.Block); - -exports.Doc = Doc; - -var BlockQuote = (function (_Block2) { - _inherits(BlockQuote, _Block2); - - function BlockQuote() { - _classCallCheck(this, BlockQuote); - - _get(Object.getPrototypeOf(BlockQuote.prototype), "constructor", this).apply(this, arguments); - } - - // ;; #toc=false The default ordered list node type. Has a single attribute, - // `order`, which determines the number at which the list starts - // counting, and defaults to 1. - return BlockQuote; -})(_schema.Block); - -exports.BlockQuote = BlockQuote; - -var OrderedList = (function (_Block3) { - _inherits(OrderedList, _Block3); - - function OrderedList() { - _classCallCheck(this, OrderedList); - - _get(Object.getPrototypeOf(OrderedList.prototype), "constructor", this).apply(this, arguments); - } - - _createClass(OrderedList, null, [{ - key: "contains", - get: function get() { - return "list_item"; - } - }]); - - return OrderedList; -})(_schema.Block); - -exports.OrderedList = OrderedList; - -OrderedList.attributes = { order: new _schema.Attribute({ "default": "1" }) }; - -// ;; #toc=false The default bullet list node type. - -var BulletList = (function (_Block4) { - _inherits(BulletList, _Block4); - - function BulletList() { - _classCallCheck(this, BulletList); - - _get(Object.getPrototypeOf(BulletList.prototype), "constructor", this).apply(this, arguments); - } - - // ;; #toc=false The default list item node type. - - _createClass(BulletList, null, [{ - key: "contains", - get: function get() { - return "list_item"; - } - }]); - - return BulletList; -})(_schema.Block); - -exports.BulletList = BulletList; - -var ListItem = (function (_Block5) { - _inherits(ListItem, _Block5); - - function ListItem() { - _classCallCheck(this, ListItem); - - _get(Object.getPrototypeOf(ListItem.prototype), "constructor", this).apply(this, arguments); - } - - // ;; #toc=false The default horizontal rule node type. - - _createClass(ListItem, null, [{ - key: "kind", - get: function get() { - return "."; - } - }]); - - return ListItem; -})(_schema.Block); - -exports.ListItem = ListItem; - -var HorizontalRule = (function (_Block6) { - _inherits(HorizontalRule, _Block6); - - function HorizontalRule() { - _classCallCheck(this, HorizontalRule); - - _get(Object.getPrototypeOf(HorizontalRule.prototype), "constructor", this).apply(this, arguments); - } - - // ;; #toc=false The default heading node type. Has a single attribute - // `level`, which indicates the heading level, and defaults to 1. - - _createClass(HorizontalRule, null, [{ - key: "contains", - get: function get() { - return null; - } - }]); - - return HorizontalRule; -})(_schema.Block); - -exports.HorizontalRule = HorizontalRule; - -var Heading = (function (_Textblock) { - _inherits(Heading, _Textblock); - - function Heading() { - _classCallCheck(this, Heading); - - _get(Object.getPrototypeOf(Heading.prototype), "constructor", this).apply(this, arguments); - } - - return Heading; -})(_schema.Textblock); - -exports.Heading = Heading; - -Heading.attributes = { level: new _schema.Attribute({ "default": "1" }) }; - -// ;; #toc=false The default code block / listing node type. Only -// allows unmarked text nodes inside of it. - -var CodeBlock = (function (_Textblock2) { - _inherits(CodeBlock, _Textblock2); - - function CodeBlock() { - _classCallCheck(this, CodeBlock); - - _get(Object.getPrototypeOf(CodeBlock.prototype), "constructor", this).apply(this, arguments); - } - - // ;; #toc=false The default paragraph node type. - - _createClass(CodeBlock, [{ - key: "containsMarks", - get: function get() { - return false; - } - }, { - key: "isCode", - get: function get() { - return true; - } - }], [{ - key: "contains", - get: function get() { - return "text"; - } - }]); - - return CodeBlock; -})(_schema.Textblock); - -exports.CodeBlock = CodeBlock; - -var Paragraph = (function (_Textblock3) { - _inherits(Paragraph, _Textblock3); - - function Paragraph() { - _classCallCheck(this, Paragraph); - - _get(Object.getPrototypeOf(Paragraph.prototype), "constructor", this).apply(this, arguments); - } - - // ;; #toc=false The default inline image node type. Has these - // attributes: - // - // - **`src`** (required): The URL of the image. - // - **`alt`**: The alt text. - // - **`title`**: The title of the image. - - _createClass(Paragraph, [{ - key: "defaultTextblock", - get: function get() { - return true; - } - }]); - - return Paragraph; -})(_schema.Textblock); - -exports.Paragraph = Paragraph; - -var Image = (function (_Inline) { - _inherits(Image, _Inline); - - function Image() { - _classCallCheck(this, Image); - - _get(Object.getPrototypeOf(Image.prototype), "constructor", this).apply(this, arguments); - } - - return Image; -})(_schema.Inline); - -exports.Image = Image; - -Image.attributes = { - src: new _schema.Attribute(), - alt: new _schema.Attribute({ "default": "" }), - title: new _schema.Attribute({ "default": "" }) -}; - -// ;; #toc=false The default hard break node type. - -var HardBreak = (function (_Inline2) { - _inherits(HardBreak, _Inline2); - - function HardBreak() { - _classCallCheck(this, HardBreak); - - _get(Object.getPrototypeOf(HardBreak.prototype), "constructor", this).apply(this, arguments); - } - - // ;; #toc=false The default emphasis mark type. - - _createClass(HardBreak, [{ - key: "selectable", - get: function get() { - return false; - } - }, { - key: "isBR", - get: function get() { - return true; - } - }]); - - return HardBreak; -})(_schema.Inline); - -exports.HardBreak = HardBreak; - -var EmMark = (function (_MarkType) { - _inherits(EmMark, _MarkType); - - function EmMark() { - _classCallCheck(this, EmMark); - - _get(Object.getPrototypeOf(EmMark.prototype), "constructor", this).apply(this, arguments); - } - - // ;; #toc=false The default strong mark type. - - _createClass(EmMark, null, [{ - key: "rank", - get: function get() { - return 51; - } - }]); - - return EmMark; -})(_schema.MarkType); - -exports.EmMark = EmMark; - -var StrongMark = (function (_MarkType2) { - _inherits(StrongMark, _MarkType2); - - function StrongMark() { - _classCallCheck(this, StrongMark); - - _get(Object.getPrototypeOf(StrongMark.prototype), "constructor", this).apply(this, arguments); - } - - // ;; #toc=false The default link mark type. Has these attributes: - // - // - **`href`** (required): The link target. - // - **`title`**: The link's title. - - _createClass(StrongMark, null, [{ - key: "rank", - get: function get() { - return 52; - } - }]); - - return StrongMark; -})(_schema.MarkType); - -exports.StrongMark = StrongMark; - -var LinkMark = (function (_MarkType3) { - _inherits(LinkMark, _MarkType3); - - function LinkMark() { - _classCallCheck(this, LinkMark); - - _get(Object.getPrototypeOf(LinkMark.prototype), "constructor", this).apply(this, arguments); - } - - _createClass(LinkMark, null, [{ - key: "rank", - get: function get() { - return 53; - } - }]); - - return LinkMark; -})(_schema.MarkType); - -exports.LinkMark = LinkMark; - -LinkMark.attributes = { - href: new _schema.Attribute(), - title: new _schema.Attribute({ "default": "" }) -}; - -// ;; #toc=false The default code font mark type. - -var CodeMark = (function (_MarkType4) { - _inherits(CodeMark, _MarkType4); - - function CodeMark() { - _classCallCheck(this, CodeMark); - - _get(Object.getPrototypeOf(CodeMark.prototype), "constructor", this).apply(this, arguments); - } - - // :: SchemaSpec - // The specification for the default schema. - - _createClass(CodeMark, [{ - key: "isCode", - get: function get() { - return true; - } - }], [{ - key: "rank", - get: function get() { - return 101; - } - }]); - - return CodeMark; -})(_schema.MarkType); - -exports.CodeMark = CodeMark; -var defaultSpec = new _schema.SchemaSpec({ - doc: Doc, - blockquote: BlockQuote, - ordered_list: OrderedList, - bullet_list: BulletList, - list_item: ListItem, - horizontal_rule: HorizontalRule, - - paragraph: Paragraph, - heading: Heading, - code_block: CodeBlock, - - text: _schema.Text, - image: Image, - hard_break: HardBreak -}, { - em: EmMark, - strong: StrongMark, - link: LinkMark, - code: CodeMark -}); - -// :: Schema -// ProseMirror's default document schema. -var defaultSchema = new _schema.Schema(defaultSpec); -exports.defaultSchema = defaultSchema; - -},{"./schema":31}],25:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.findDiffStart = findDiffStart; -exports.findDiffEnd = findDiffEnd; - -var _pos = require("./pos"); - -// :: (Node, Node) → ?Pos -// Find the first position at which nodes `a` and `b` differ, or -// `null` if they are the same. - -function findDiffStart(a, b) { - var path = arguments.length <= 2 || arguments[2] === undefined ? [] : arguments[2]; - - var iA = a.iter(), - iB = b.iter(), - offset = 0; - for (;;) { - if (iA.atEnd() || iB.atEnd()) { - if (a.size == b.size) return null; - break; - } - - var childA = iA.next(), - childB = iB.next(); - if (childA == childB) { - offset += childA.width;continue; - } - - if (!childA.sameMarkup(childB)) break; - - if (childA.isText && childA.text != childB.text) { - for (var j = 0; childA.text[j] == childB.text[j]; j++) { - offset++; - }break; - } - - if (childA.size || childB.size) { - path.push(offset); - var inner = findDiffStart(childA.content, childB.content, path); - if (inner) return inner; - path.pop(); - } - offset += childA.width; - } - return new _pos.Pos(path, offset); -} - -// :: (Node, Node) → ?{a: Pos, b: Pos} -// Find the first position, searching from the end, at which nodes `a` -// and `b` differ, or `null` if they are the same. Since this position -// will not be the same in both nodes, an object with two separate -// positions is returned. - -function findDiffEnd(a, b) { - var pathA = arguments.length <= 2 || arguments[2] === undefined ? [] : arguments[2]; - var pathB = arguments.length <= 3 || arguments[3] === undefined ? [] : arguments[3]; - - var iA = a.reverseIter(), - iB = b.reverseIter(); - var offA = a.size, - offB = b.size; - - for (;;) { - if (iA.atEnd() || iB.atEnd()) { - if (a.size == b.size) return null; - break; - } - var childA = iA.next(), - childB = iB.next(); - if (childA == childB) { - offA -= childA.width;offB -= childB.width; - continue; - } - - if (!childA.sameMarkup(childB)) break; - - if (childA.isText && childA.text != childB.text) { - var same = 0, - minSize = Math.min(childA.text.length, childB.text.length); - while (same < minSize && childA.text[childA.text.length - same - 1] == childB.text[childB.text.length - same - 1]) { - same++;offA--;offB--; - } - break; - } - offA -= childA.width;offB -= childB.width; - if (childA.size || childB.size) { - pathA.push(offA);pathB.push(offB); - var inner = findDiffEnd(childA.content, childB.content, pathA, pathB); - if (inner) return inner; - pathA.pop();pathB.pop(); - } - } - return { a: new _pos.Pos(pathA, offA), b: new _pos.Pos(pathB, offB) }; -} - -},{"./pos":30}],26:[function(require,module,exports){ -// ;; A fragment is an abstract type used to represent a node's -// collection of child nodes. It tries to hide considerations about -// the actual way in which the child nodes are stored, so that -// different representations (nodes that only contain simple nodes -// versus nodes that also contain text) can be approached using the -// same API. -// -// Fragments are persistent data structures. That means you should -// _not_ mutate them or their content, but create new instances -// whenever needed. The API tries to make this easy. -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _get = function get(_x16, _x17, _x18) { - var _again = true;_function: while (_again) { - var object = _x16, - property = _x17, - receiver = _x18;_again = false;if (object === null) object = Function.prototype;var desc = Object.getOwnPropertyDescriptor(object, property);if (desc === undefined) { - var parent = Object.getPrototypeOf(object);if (parent === null) { - return undefined; - } else { - _x16 = parent;_x17 = property;_x18 = receiver;_again = true;desc = parent = undefined;continue _function; - } - } else if ("value" in desc) { - return desc.value; - } else { - var getter = desc.get;if (getter === undefined) { - return undefined; - }return getter.call(receiver); - } - } -}; - -var _createClass = (function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); - } - }return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; - }; -})(); - -function _inherits(subClass, superClass) { - if (typeof superClass !== "function" && superClass !== null) { - throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); - }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; -} - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -var Fragment = (function () { - function Fragment() { - _classCallCheck(this, Fragment); - } - - _createClass(Fragment, [{ - key: "append", - - // :: (Fragment, number, number) → Fragment - // Create a fragment that combines this one with another fragment. - // Takes care of merging adjacent text nodes and can also merge - // “open” nodes at the boundary. `joinLeft` and `joinRight` give the - // depth to which the left and right fragments are open. If open - // nodes with the same markup are found on both sides, they are - // joined. If not, the open nodes are [closed](#Node.close). - value: function append(other) { - var joinLeft = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1]; - var joinRight = arguments.length <= 2 || arguments[2] === undefined ? 0 : arguments[2]; - - if (!this.size) return joinRight ? other.replace(0, other.firstChild.close(joinRight - 1, "start")) : other; - if (!other.size) return joinLeft ? this.replace(this.size - 1, this.lastChild.close(joinLeft - 1, "end")) : this; - return this.appendInner(other, joinLeft, joinRight); - } - - // :: string - // Concatenate all the text nodes found in this fragment and its - // children. - }, { - key: "toString", - - // :: () → string - // Return a debugging string that describes this fragment. - value: function toString() { - var str = ""; - this.forEach(function (n) { - return str += (str ? ", " : "") + n.toString(); - }); - return str; - } - - // :: (number, number, ?(Node) → Node) → [Node] - // Produce an array with the child nodes between the given - // boundaries, optionally mapping a function over them. - }, { - key: "toArray", - value: function toArray(from, to, f) { - if (from === undefined) from = 0; - if (to === undefined) to = this.size; - - var result = []; - for (var iter = this.iter(from, to), n = undefined; n = iter.next().value;) { - result.push(f ? f(n) : n); - }return result; - } - - // :: ((Node) → Node) → Fragment - // Produce a new Fragment by mapping all this fragment's children - // through a function. - }, { - key: "map", - value: function map(f) { - // FIXME join text nodes? - return Fragment.fromArray(this.toArray(undefined, undefined, f)); - } - - // :: ((Node) → bool) → bool - // Returns `true` if the given function returned `true` for any of - // the fragment's children. - }, { - key: "some", - value: function some(f) { - for (var iter = this.iter(), n = undefined; n = iter.next().value;) { - if (f(n)) return n; - } - } - }, { - key: "close", - value: function close(depth, side) { - var child = side == "start" ? this.firstChild : this.lastChild; - var closed = child.close(depth - 1, side); - if (closed == child) return this; - return this.replace(side == "start" ? 0 : this.size - 1, closed); - } - }, { - key: "nodesBetween", - value: function nodesBetween(from, to, f, path, parent) { - var moreFrom = from && from.depth > path.length, - moreTo = to && to.depth > path.length; - var start = moreFrom ? from.path[path.length] : from ? from.offset : 0; - var end = moreTo ? to.path[path.length] + 1 : to ? to.offset : this.size; - for (var iter = this.iter(start, end), node = undefined; node = iter.next().value;) { - var startOffset = iter.offset - node.width; - path.push(startOffset); - node.nodesBetween(moreFrom && startOffset == start ? from : null, moreTo && iter.offset == end ? to : null, f, path, parent); - path.pop(); - } - } - - // :: (?Pos, ?Pos) → Fragment - // Slice out the sub-fragment between the two given positions. - // `null` can be passed for either to indicate the slice should go - // all the way to the start or end of the fragment. - }, { - key: "sliceBetween", - value: function sliceBetween(from, to) { - var depth = arguments.length <= 2 || arguments[2] === undefined ? 0 : arguments[2]; - - var moreFrom = from && from.depth > depth, - moreTo = to && to.depth > depth; - var start = moreFrom ? from.path[depth] : from ? from.offset : 0; - var end = moreTo ? to.path[depth] + 1 : to ? to.offset : this.size; - var nodes = []; - for (var iter = this.iter(start, end), node = undefined; node = iter.next().value;) { - var passFrom = moreFrom && iter.offset - node.width == start ? from : null; - var passTo = moreTo && iter.offset == end ? to : null; - if (passFrom || passTo) node = node.sliceBetween(passFrom, passTo, depth + 1); - nodes.push(node); - } - return new this.constructor(nodes); - } - - // :: (Schema, Object) → Fragment - // Deserialize a fragment from its JSON representation. - }, { - key: "textContent", - get: function get() { - var text = ""; - this.forEach(function (n) { - return text += n.textContent; - }); - return text; - } - }], [{ - key: "fromJSON", - value: function fromJSON(schema, value) { - return value ? this.fromArray(value.map(schema.nodeFromJSON)) : emptyFragment; - } - - // :: ([Node]) → Fragment - // Build a fragment from an array of nodes. - }, { - key: "fromArray", - value: function fromArray(array) { - if (!array.length) return emptyFragment; - var hasText = false; - for (var i = 0; i < array.length; i++) { - if (array[i].isText) hasText = true; - }return new (hasText ? TextFragment : FlatFragment)(array); - } - - // :: (?union) → Fragment - // Create a fragment from something that can be interpreted as a set - // of nodes. For `null`, it returns the empty fragment. For a - // fragment, the fragment itself. For a node or array of nodes, a - // fragment containing those nodes. - }, { - key: "from", - value: function from(nodes) { - if (!nodes) return emptyFragment; - if (nodes instanceof Fragment) return nodes; - return this.fromArray(Array.isArray(nodes) ? nodes : [nodes]); - } - }]); - - return Fragment; -})(); - -exports.Fragment = Fragment; - -var iterEnd = { done: true }; - -var FlatIterator = (function () { - function FlatIterator(array, pos, end) { - _classCallCheck(this, FlatIterator); - - this.array = array; - this.pos = pos; - this.end = end; - } - - _createClass(FlatIterator, [{ - key: "copy", - value: function copy() { - return new this.constructor(this.array, this.pos, this.end); - } - }, { - key: "atEnd", - value: function atEnd() { - return this.pos == this.end; - } - }, { - key: "next", - value: function next() { - return this.pos == this.end ? iterEnd : this.array[this.pos++]; - } - }, { - key: "offset", - get: function get() { - return this.pos; - } - }]); - - return FlatIterator; -})(); - -var ReverseFlatIterator = (function (_FlatIterator) { - _inherits(ReverseFlatIterator, _FlatIterator); - - function ReverseFlatIterator() { - _classCallCheck(this, ReverseFlatIterator); - - _get(Object.getPrototypeOf(ReverseFlatIterator.prototype), "constructor", this).apply(this, arguments); - } - - // ;; #forward=Fragment - - _createClass(ReverseFlatIterator, [{ - key: "next", - value: function next() { - return this.pos == this.end ? iterEnd : this.array[--this.pos]; - } - }]); - - return ReverseFlatIterator; -})(FlatIterator); - -var FlatFragment = (function (_Fragment) { - _inherits(FlatFragment, _Fragment); - - function FlatFragment(content) { - _classCallCheck(this, FlatFragment); - - _get(Object.getPrototypeOf(FlatFragment.prototype), "constructor", this).call(this); - this.content = content; - } - - // :: Fragment - // An empty fragment. Intended to be reused whenever a node doesn't - // contain anything (rather than allocating a new empty fragment for - // each leaf node). - - // :: (?number, ?number) → Iterator - // Create a forward iterator over the content of the fragment. An - // explicit start and end offset can be given to have the iterator - // go over only part of the content. If an iteration bound falls - // within a text node, only the part that is within the bounds is - // yielded. - - _createClass(FlatFragment, [{ - key: "iter", - value: function iter() { - var start = arguments.length <= 0 || arguments[0] === undefined ? 0 : arguments[0]; - var end = arguments.length <= 1 || arguments[1] === undefined ? this.size : arguments[1]; - - return new FlatIterator(this.content, start, end); - } - - // :: (?number, ?number) → Iterator - // Create a reverse iterator over the content of the fragment. An - // explicit start and end offset can be given to have the iterator - // go over only part of the content. **Note**: `start` should be - // greater than `end`, when passed. - }, { - key: "reverseIter", - value: function reverseIter() { - var start = arguments.length <= 0 || arguments[0] === undefined ? this.size : arguments[0]; - var end = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1]; - - return new ReverseFlatIterator(this.content, start, end); - } - - // :: number - // The maximum offset in this fragment. - }, { - key: "child", - - // :: (number) → Node - // Get the child at the given offset. Might return a text node that - // stretches before and/or after the offset. - value: function child(off) { - if (off < 0 || off >= this.content.length) throw new Error("Offset " + off + " out of range"); - return this.content[off]; - } - - // :: ((node: Node, start: number, end: number)) - // Call the given function for each node in the fragment, passing it - // the node, its start offset, and its end offset. - }, { - key: "forEach", - value: function forEach(f) { - for (var i = 0; i < this.content.length; i++) { - f(this.content[i], i, i + 1); - } - } - - // :: (number) → {start: number, node: Node} - // Find the node before the given offset. Returns an object - // containing the node as well as its start index. Offset should be - // greater than zero. - }, { - key: "chunkBefore", - value: function chunkBefore(off) { - return { node: this.child(off - 1), start: off - 1 }; - } - - // :: (number) → {start: number, node: Node} - // Find the node after the given offset. Returns an object - // containing the node as well as its start index. Offset should be - // less than the fragment's size. - }, { - key: "chunkAfter", - value: function chunkAfter(off) { - return { node: this.child(off), start: off }; - } - - // :: (number, ?number) → Fragment - // Return a fragment with only the nodes between the given offsets. - // When `to` is not given, the slice will go to the end of the - // fragment. - }, { - key: "slice", - value: function slice(from) { - var to = arguments.length <= 1 || arguments[1] === undefined ? this.size : arguments[1]; - - if (from == to) return emptyFragment; - return new FlatFragment(this.content.slice(from, to)); - } - - // :: (number, Node) → Fragment - // Return a fragment in which the node at the given offset is - // replaced by the given node. The node, as well as the one it - // replaces, should not be text nodes. - }, { - key: "replace", - value: function replace(offset, node) { - if (node.isText) throw new Error("Argument to replace should be a non-text node"); - var copy = this.content.slice(); - copy[offset] = node; - return new FlatFragment(copy); - } - }, { - key: "appendInner", - value: function appendInner(other, joinLeft, joinRight) { - var last = this.content.length - 1, - content = this.content.slice(0, last); - var before = this.content[last], - after = other.firstChild; - if (joinLeft > 0 && joinRight > 0 && before.sameMarkup(after)) content.push(before.append(after.content, joinLeft - 1, joinRight - 1));else content.push(before.close(joinLeft - 1, "end"), after.close(joinRight - 1, "start")); - return Fragment.fromArray(content.concat(other.toArray(after.width))); - } - - // :: () → Object - // Create a JSON-serializeable representation of this fragment. - }, { - key: "toJSON", - value: function toJSON() { - return this.content.map(function (n) { - return n.toJSON(); - }); - } - }, { - key: "size", - get: function get() { - return this.content.length; - } - - // :: ?Node - // The first child of the fragment, or `null` if it is empty. - }, { - key: "firstChild", - get: function get() { - return this.content.length ? this.content[0] : null; - } - - // :: ?Node - // The last child of the fragment, or `null` if it is empty. - }, { - key: "lastChild", - get: function get() { - return this.content.length ? this.content[this.content.length - 1] : null; - } - }]); - - return FlatFragment; -})(Fragment); - -var emptyFragment = new FlatFragment([]); - -exports.emptyFragment = emptyFragment; - -var TextIterator = (function () { - function TextIterator(fragment, startOffset, endOffset) { - var pos = arguments.length <= 3 || arguments[3] === undefined ? -1 : arguments[3]; - - _classCallCheck(this, TextIterator); - - this.frag = fragment; - this.offset = startOffset; - this.pos = pos; - this.endOffset = endOffset; - } - - _createClass(TextIterator, [{ - key: "copy", - value: function copy() { - return new this.constructor(this.frag, this.offset, this.endOffset, this.pos); - } - }, { - key: "atEnd", - value: function atEnd() { - return this.offset == this.endOffset; - } - }, { - key: "next", - value: function next() { - if (this.pos == -1) { - var start = this.init(); - if (start) return start; - } - return this.offset == this.endOffset ? iterEnd : this.advance(); - } - }, { - key: "advance", - value: function advance() { - var node = this.frag.content[this.pos++], - end = this.offset + node.width; - if (end > this.endOffset) { - node = node.copy(node.text.slice(0, this.endOffset - this.offset)); - this.offset = this.endOffset; - return node; - } - this.offset = end; - return node; - } - }, { - key: "init", - value: function init() { - this.pos = 0; - var offset = 0; - while (offset < this.offset) { - var node = this.frag.content[this.pos++], - end = offset + node.width; - if (end == this.offset) break; - if (end > this.offset) { - var sliceEnd = node.width; - if (end > this.endOffset) { - sliceEnd = this.endOffset - offset; - end = this.endOffset; - } - node = node.copy(node.text.slice(this.offset - offset, sliceEnd)); - this.offset = end; - return node; - } - offset = end; - } - } - }]); - - return TextIterator; -})(); - -var ReverseTextIterator = (function (_TextIterator) { - _inherits(ReverseTextIterator, _TextIterator); - - function ReverseTextIterator() { - _classCallCheck(this, ReverseTextIterator); - - _get(Object.getPrototypeOf(ReverseTextIterator.prototype), "constructor", this).apply(this, arguments); - } - - _createClass(ReverseTextIterator, [{ - key: "advance", - value: function advance() { - var node = this.frag.content[--this.pos], - end = this.offset - node.width; - if (end < this.endOffset) { - node = node.copy(node.text.slice(this.endOffset - end)); - this.offset = this.endOffset; - return node; - } - this.offset = end; - return node; - } - }, { - key: "init", - value: function init() { - this.pos = this.frag.content.length; - var offset = this.frag.size; - while (offset > this.offset) { - var node = this.frag.content[--this.pos], - end = offset - node.width; - if (end == this.offset) break; - if (end < this.offset) { - if (end < this.endOffset) { - node = node.copy(node.text.slice(this.endOffset - end, this.offset - end)); - end = this.endOffset; - } else { - node = node.copy(node.text.slice(0, this.offset - end)); - } - this.offset = end; - return node; - } - offset = end; - } - } - }]); - - return ReverseTextIterator; -})(TextIterator); - -var TextFragment = (function (_Fragment2) { - _inherits(TextFragment, _Fragment2); - - function TextFragment(content, size) { - _classCallCheck(this, TextFragment); - - _get(Object.getPrototypeOf(TextFragment.prototype), "constructor", this).call(this); - this.content = content; - this.size = size || 0; - if (size == null) for (var i = 0; i < content.length; i++) { - this.size += content[i].width; - } - } - - _createClass(TextFragment, [{ - key: "iter", - value: function iter() { - var from = arguments.length <= 0 || arguments[0] === undefined ? 0 : arguments[0]; - var to = arguments.length <= 1 || arguments[1] === undefined ? this.size : arguments[1]; - - return new TextIterator(this, from, to); - } - }, { - key: "reverseIter", - value: function reverseIter() { - var from = arguments.length <= 0 || arguments[0] === undefined ? this.size : arguments[0]; - var to = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1]; - - return new ReverseTextIterator(this, from, to); - } - }, { - key: "child", - value: function child(off) { - if (off < 0 || off >= this.size) throw new Error("Offset " + off + " out of range"); - for (var i = 0, curOff = 0; i < this.content.length; i++) { - var child = this.content[i]; - curOff += child.width; - if (curOff > off) return child; - } - } - }, { - key: "forEach", - value: function forEach(f) { - for (var i = 0, off = 0; i < this.content.length; i++) { - var child = this.content[i]; - f(child, off, off += child.width); - } - } - }, { - key: "chunkBefore", - value: function chunkBefore(off) { - if (!off) throw new Error("No chunk before start of node"); - for (var i = 0, curOff = 0; i < this.content.length; i++) { - var child = this.content[i], - end = curOff + child.width; - if (end >= off) return { node: child, start: curOff }; - curOff = end; - } - } - }, { - key: "chunkAfter", - value: function chunkAfter(off) { - if (off == this.size) throw new Error("No chunk after end of node"); - for (var i = 0, curOff = 0; i < this.content.length; i++) { - var child = this.content[i], - end = curOff + child.width; - if (end > off) return { node: child, start: curOff }; - curOff = end; - } - } - }, { - key: "slice", - value: function slice() { - var from = arguments.length <= 0 || arguments[0] === undefined ? 0 : arguments[0]; - var to = arguments.length <= 1 || arguments[1] === undefined ? this.size : arguments[1]; - - if (from == to) return emptyFragment; - return new TextFragment(this.toArray(from, to)); - } - }, { - key: "replace", - value: function replace(off, node) { - if (node.isText) throw new Error("Argument to replace should be a non-text node"); - var curNode = undefined, - index = undefined; - for (var curOff = 0; curOff < off; index++) { - curNode = this.content[index]; - curOff += curNode.width; - } - if (curNode.isText) throw new Error("Can not replace text content with replace method"); - var copy = this.content.slice(); - copy[index] = node; - return new TextFragment(copy); - } - }, { - key: "appendInner", - value: function appendInner(other, joinLeft, joinRight) { - var last = this.content.length - 1, - content = this.content.slice(0, last); - var before = this.content[last], - after = other.firstChild; - var same = before.sameMarkup(after); - if (same && before.isText) content.push(before.copy(before.text + after.text));else if (same && joinLeft > 0 && joinRight > 0) content.push(before.append(after.content, joinLeft - 1, joinRight - 1));else content.push(before.close(joinLeft - 1, "end"), after.close(joinRight - 1, "start")); - return Fragment.fromArray(content.concat(other.toArray(after.width))); - } - }, { - key: "toJSON", - value: function toJSON() { - return this.content.map(function (n) { - return n.toJSON(); - }); - } - }, { - key: "firstChild", - get: function get() { - return this.size ? this.content[0] : null; - } - }, { - key: "lastChild", - get: function get() { - return this.size ? this.content[this.content.length - 1] : null; - } - }]); - - return TextFragment; -})(Fragment); - -if (typeof Symbol != "undefined") { - // :: () → Iterator - // A fragment is iterable, in the ES6 sense. - Fragment.prototype[Symbol.iterator] = function () { - return this.iter(); - }; - FlatIterator.prototype[Symbol.iterator] = TextIterator.prototype[Symbol.iterator] = function () { - return this; - }; -} - -},{}],27:[function(require,module,exports){ -// !! -// This module defines ProseMirror's document model, the data -// structure used to define and inspect content documents. It -// includes: -// -// * The [node](#Node) type that represents document elements -// -// * The [schema](#Schema) types used to tag and constrain the -// document structure -// -// * The data type for document [positions](#Pos) -// -// This module does not depend on the browser API being available -// (i.e. you can load it into any JavaScript environment). - -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _node = require("./node"); - -Object.defineProperty(exports, "Node", { - enumerable: true, - get: function get() { - return _node.Node; - } -}); - -var _fragment = require("./fragment"); - -Object.defineProperty(exports, "Fragment", { - enumerable: true, - get: function get() { - return _fragment.Fragment; - } -}); -Object.defineProperty(exports, "emptyFragment", { - enumerable: true, - get: function get() { - return _fragment.emptyFragment; - } -}); - -var _mark = require("./mark"); - -Object.defineProperty(exports, "Mark", { - enumerable: true, - get: function get() { - return _mark.Mark; - } -}); - -var _schema = require("./schema"); - -Object.defineProperty(exports, "SchemaSpec", { - enumerable: true, - get: function get() { - return _schema.SchemaSpec; - } -}); -Object.defineProperty(exports, "Schema", { - enumerable: true, - get: function get() { - return _schema.Schema; - } -}); -Object.defineProperty(exports, "SchemaError", { - enumerable: true, - get: function get() { - return _schema.SchemaError; - } -}); -Object.defineProperty(exports, "NodeType", { - enumerable: true, - get: function get() { - return _schema.NodeType; - } -}); -Object.defineProperty(exports, "Block", { - enumerable: true, - get: function get() { - return _schema.Block; - } -}); -Object.defineProperty(exports, "Textblock", { - enumerable: true, - get: function get() { - return _schema.Textblock; - } -}); -Object.defineProperty(exports, "Inline", { - enumerable: true, - get: function get() { - return _schema.Inline; - } -}); -Object.defineProperty(exports, "Text", { - enumerable: true, - get: function get() { - return _schema.Text; - } -}); -Object.defineProperty(exports, "MarkType", { - enumerable: true, - get: function get() { - return _schema.MarkType; - } -}); -Object.defineProperty(exports, "Attribute", { - enumerable: true, - get: function get() { - return _schema.Attribute; - } -}); - -var _defaultschema = require("./defaultschema"); - -Object.defineProperty(exports, "defaultSchema", { - enumerable: true, - get: function get() { - return _defaultschema.defaultSchema; - } -}); -Object.defineProperty(exports, "Doc", { - enumerable: true, - get: function get() { - return _defaultschema.Doc; - } -}); -Object.defineProperty(exports, "BlockQuote", { - enumerable: true, - get: function get() { - return _defaultschema.BlockQuote; - } -}); -Object.defineProperty(exports, "OrderedList", { - enumerable: true, - get: function get() { - return _defaultschema.OrderedList; - } -}); -Object.defineProperty(exports, "BulletList", { - enumerable: true, - get: function get() { - return _defaultschema.BulletList; - } -}); -Object.defineProperty(exports, "ListItem", { - enumerable: true, - get: function get() { - return _defaultschema.ListItem; - } -}); -Object.defineProperty(exports, "HorizontalRule", { - enumerable: true, - get: function get() { - return _defaultschema.HorizontalRule; - } -}); -Object.defineProperty(exports, "Paragraph", { - enumerable: true, - get: function get() { - return _defaultschema.Paragraph; - } -}); -Object.defineProperty(exports, "Heading", { - enumerable: true, - get: function get() { - return _defaultschema.Heading; - } -}); -Object.defineProperty(exports, "CodeBlock", { - enumerable: true, - get: function get() { - return _defaultschema.CodeBlock; - } -}); -Object.defineProperty(exports, "Image", { - enumerable: true, - get: function get() { - return _defaultschema.Image; - } -}); -Object.defineProperty(exports, "HardBreak", { - enumerable: true, - get: function get() { - return _defaultschema.HardBreak; - } -}); -Object.defineProperty(exports, "CodeMark", { - enumerable: true, - get: function get() { - return _defaultschema.CodeMark; - } -}); -Object.defineProperty(exports, "EmMark", { - enumerable: true, - get: function get() { - return _defaultschema.EmMark; - } -}); -Object.defineProperty(exports, "StrongMark", { - enumerable: true, - get: function get() { - return _defaultschema.StrongMark; - } -}); -Object.defineProperty(exports, "LinkMark", { - enumerable: true, - get: function get() { - return _defaultschema.LinkMark; - } -}); - -var _pos = require("./pos"); - -Object.defineProperty(exports, "Pos", { - enumerable: true, - get: function get() { - return _pos.Pos; - } -}); - -var _diff = require("./diff"); - -Object.defineProperty(exports, "findDiffStart", { - enumerable: true, - get: function get() { - return _diff.findDiffStart; - } -}); -Object.defineProperty(exports, "findDiffEnd", { - enumerable: true, - get: function get() { - return _diff.findDiffEnd; - } -}); - -},{"./defaultschema":24,"./diff":25,"./fragment":26,"./mark":28,"./node":29,"./pos":30,"./schema":31}],28:[function(require,module,exports){ -// ;; A mark is a piece of information that can be attached to a node, -// such as it being emphasized, in code font, or a link. It has a type -// and optionally a set of attributes that provide further information -// (such as the target of the link). Marks are created through a -// `Schema`, which controls which types exist and which -// attributes they have. -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = (function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); - } - }return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; - }; -})(); - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -var Mark = (function () { - function Mark(type, attrs) { - _classCallCheck(this, Mark); - - // :: MarkType - // The type of this mark. - this.type = type; - // :: Object - // The attributes associated with this mark. - this.attrs = attrs; - } - - // :: () → Object - // Convert this mark to a JSON-serializeable representation. - - _createClass(Mark, [{ - key: "toJSON", - value: function toJSON() { - if (this.type.instance) return this.type.name; - var obj = { _: this.type.name }; - for (var attr in this.attrs) { - obj[attr] = this.attrs[attr]; - }return obj; - } - - // :: ([Mark]) → [Mark] - // Given a set of marks, create a new set which contains this one as - // well, in the right position. If this mark or another of its type - // is already in the set, the set itself is returned. - }, { - key: "addToSet", - value: function addToSet(set) { - for (var i = 0; i < set.length; i++) { - var other = set[i]; - if (other.type == this.type) { - if (this.eq(other)) return set;else return set.slice(0, i).concat(this).concat(set.slice(i + 1)); - } - if (other.type.rank > this.type.rank) return set.slice(0, i).concat(this).concat(set.slice(i)); - } - return set.concat(this); - } - - // :: ([Mark]) → [Mark] - // Remove this mark from the given set, returning a new set. If this - // mark is not in the set, the set itself is returned. - }, { - key: "removeFromSet", - value: function removeFromSet(set) { - for (var i = 0; i < set.length; i++) if (this.eq(set[i])) return set.slice(0, i).concat(set.slice(i + 1)); - return set; - } - - // :: ([Mark]) → bool - // Test whether this mark is in the given set of marks. - }, { - key: "isInSet", - value: function isInSet(set) { - for (var i = 0; i < set.length; i++) { - if (this.eq(set[i])) return true; - }return false; - } - - // :: (Mark) → bool - // Test whether this mark has the same type and attributes as - // another mark. - }, { - key: "eq", - value: function eq(other) { - if (this == other) return true; - if (this.type != other.type) return false; - for (var attr in this.attrs) { - if (other.attrs[attr] != this.attrs[attr]) return false; - }return true; - } - - // :: ([Mark], [Mark]) → bool - // Test whether two sets of marks are identical. - }], [{ - key: "sameSet", - value: function sameSet(a, b) { - if (a == b) return true; - if (a.length != b.length) return false; - for (var i = 0; i < a.length; i++) { - if (!a[i].eq(b[i])) return false; - }return true; - } - - // :: (?union) → [Mark] - // Create a properly sorted mark set from null, a single mark, or an - // unsorted array of marks. - }, { - key: "setFrom", - value: function setFrom(marks) { - if (!marks || marks.length == 0) return empty; - if (marks instanceof Mark) return [marks]; - var copy = marks.slice(); - copy.sort(function (a, b) { - return a.type.rank - b.type.rank; - }); - return copy; - } - }]); - - return Mark; -})(); - -exports.Mark = Mark; - -var empty = []; - -},{}],29:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _get = function get(_x8, _x9, _x10) { - var _again = true;_function: while (_again) { - var object = _x8, - property = _x9, - receiver = _x10;_again = false;if (object === null) object = Function.prototype;var desc = Object.getOwnPropertyDescriptor(object, property);if (desc === undefined) { - var parent = Object.getPrototypeOf(object);if (parent === null) { - return undefined; - } else { - _x8 = parent;_x9 = property;_x10 = receiver;_again = true;desc = parent = undefined;continue _function; - } - } else if ("value" in desc) { - return desc.value; - } else { - var getter = desc.get;if (getter === undefined) { - return undefined; - }return getter.call(receiver); - } - } -}; - -var _createClass = (function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); - } - }return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; - }; -})(); - -function _inherits(subClass, superClass) { - if (typeof superClass !== "function" && superClass !== null) { - throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); - }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; -} - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -var _fragment = require("./fragment"); - -var _mark = require("./mark"); - -var _pos = require("./pos"); - -var emptyArray = [], - emptyAttrs = Object.create(null); - -// ;; This class represents a node in the tree that makes up a -// ProseMirror document. So a document is an instance of `Node`, with -// children that are also instances of `Node`. -// -// Nodes are persistent data structures. Instead of changing them, you -// create new ones with the content you want. Old ones keep pointing -// at the old document shape. This is made cheaper by sharing -// structure between the old and new data as much as possible, which a -// tree shape like this (without back pointers) makes easy. -// -// **Never** directly mutate the properties of a `Node` object. - -var Node = (function () { - function Node(type, attrs, content, marks) { - _classCallCheck(this, Node); - - // :: NodeType - // The type of node that this is. - this.type = type; - - // :: Object - // An object mapping attribute names to string values. The kind of - // attributes allowed and required are determined by the node - // type. - this.attrs = attrs; - - // :: Fragment - // The node's content. - this.content = content || _fragment.emptyFragment; - - // :: [Mark] - // The marks (things like whether it is emphasized or part of a - // link) associated with this node. - this.marks = marks || emptyArray; - } - - // :: number - // The size of the node's content, which is the maximum offset in - // the node. For nodes that don't contain text, this is also the - // number of child nodes that the node has. - - _createClass(Node, [{ - key: "child", - - // :: (number) → Node - // Retrieve the child at the given offset. Note that this is **not** - // the appropriate way to loop over a node. `child`'s complexity may - // be non-constant for some nodes, and it will return the same node - // multiple times when calling it for different offsets within a - // text node. - value: function child(off) { - return this.content.child(off); - } - - // :: (?number, ?number) → Iterator - // Create an iterator over this node's children, optionally starting - // and ending at a given offset. - }, { - key: "iter", - value: function iter(start, end) { - return this.content.iter(start, end); - } - - // :: (?number, ?number) → Iterator - // Create a reverse iterator (iterating from the node's end towards - // its start) over this node's children, optionally starting and - // ending at a given offset. **Note**: if given, `start` should be - // greater than (or equal) to `end`. - }, { - key: "reverseIter", - value: function reverseIter(start, end) { - return this.content.reverseIter(start, end); - } - - // :: (number) → {start: number, node: Node} - // Find the node that sits before a given offset. Can be used to - // find out which text node covers a given offset. The `start` - // property of the return value is the starting offset of the - // returned node. It is an error to call this with offset 0. - }, { - key: "chunkBefore", - value: function chunkBefore(off) { - return this.content.chunkBefore(off); - } - - // :: (number) → {start: number, node: Node} - // Find the node that sits after a given offset. The `start` - // property of the return value is the starting offset of the - // returned node. It is an error to call this with offset - // corresponding to the end of the node. - }, { - key: "chunkAfter", - value: function chunkAfter(off) { - return this.content.chunkAfter(off); - } - - // :: ((node: Node, start: number, end: number)) - // Call the given function for each child node. The function will be - // given the node, as well as its start and end offsets, as - // arguments. - }, { - key: "forEach", - value: function forEach(f) { - this.content.forEach(f); - } - - // :: string - // Concatenate all the text nodes found in this fragment and its - // children. - }, { - key: "sameMarkup", - - // :: (Node) → bool - // Compare the markup (type, attributes, and marks) of this node to - // those of another. Returns `true` if both have the same markup. - value: function sameMarkup(other) { - return this.hasMarkup(other.type, other.attrs, other.marks); - } - - // :: (NodeType, ?Object, ?[Mark]) → bool - // Check whether this node's markup correspond to the given type, - // attributes, and marks. - }, { - key: "hasMarkup", - value: function hasMarkup(type, attrs, marks) { - return this.type == type && Node.sameAttrs(this.attrs, attrs || emptyAttrs) && _mark.Mark.sameSet(this.marks, marks || emptyArray); - } - }, { - key: "copy", - - // :: (?Fragment) → Node - // Create a new node with the same markup as this node, containing - // the given content (or empty, if no content is given). - value: function copy() { - var content = arguments.length <= 0 || arguments[0] === undefined ? null : arguments[0]; - - return new this.constructor(this.type, this.attrs, content, this.marks); - } - - // :: ([Mark]) → Node - // Create a copy of this node, with the given set of marks instead - // of the node's own marks. - }, { - key: "mark", - value: function mark(marks) { - return new this.constructor(this.type, this.attrs, this.content, marks); - } - - // :: (number, ?number) → Node - // Create a copy of this node with only the content between the - // given offsets. If `to` is not given, it defaults to the end of - // the node. - }, { - key: "slice", - value: function slice(from, to) { - return this.copy(this.content.slice(from, to)); - } - - // :: (number, number, Fragment) → Node - // Create a copy of this node with the content between the given - // offsets replaced by the given fragment. - }, { - key: "splice", - value: function splice(from, to, replace) { - return this.copy(this.content.slice(0, from).append(replace).append(this.content.slice(to))); - } - - // :: (Fragment, ?number, ?number) → Node - // [Append](#Fragment.append) the given fragment to this node's - // content, and create a new node with the result. - }, { - key: "append", - value: function append(fragment) { - var joinLeft = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1]; - var joinRight = arguments.length <= 2 || arguments[2] === undefined ? 0 : arguments[2]; - - return this.copy(this.content.append(fragment, joinLeft, joinRight)); - } - - // :: (number, Node) → Node - // Return a copy of this node with the child at the given offset - // replaced by the given node. **Note**: The offset should not fall - // within a text node. - }, { - key: "replace", - value: function replace(pos, node) { - return this.copy(this.content.replace(pos, node)); - } - - // :: ([number], Node) → Node - // Return a copy of this node with the descendant at `path` replaced - // by the given replacement node. This will copy as many sub-nodes as - // there are elements in `path`. - }, { - key: "replaceDeep", - value: function replaceDeep(path, node) { - var depth = arguments.length <= 2 || arguments[2] === undefined ? 0 : arguments[2]; - - if (depth == path.length) return node; - var pos = path[depth]; - return this.replace(pos, this.child(pos).replaceDeep(path, node, depth + 1)); - } - - // :: (number, string) → Node - // “Close” this node by making sure that, if it is empty, and is not - // allowed to be so, it has its default content inserted. When depth - // is greater than zero, sub-nodes at the given side (which can be - // `"start"` or `"end"`) are closed too. Returns itself if no work - // is necessary, or a closed copy if something did need to happen. - }, { - key: "close", - value: function close(depth, side) { - if (depth == 0 && this.size == 0 && !this.type.canBeEmpty) return this.copy(this.type.defaultContent()); - var closedContent = undefined; - if (depth > 0 && (closedContent = this.content.close(depth - 1, side)) != this.content) return this.copy(closedContent); - return this; - } - - // :: ([number]) → Node - // Get the descendant node at the given path, which is interpreted - // as a series of offsets into successively deeper nodes. - }, { - key: "path", - value: function path(_path) { - for (var i = 0, node = this; i < _path.length; node = node.child(_path[i]), i++) {} - return node; - } - - // :: (Pos) → Node - // Get the node after the given position. - }, { - key: "nodeAfter", - value: function nodeAfter(pos) { - return this.path(pos.path).child(pos.offset); - } - }, { - key: "pathNodes", - value: function pathNodes(path) { - var nodes = []; - for (var i = 0, node = this;; i++) { - nodes.push(node); - if (i == path.length) break; - node = node.child(path[i]); - } - return nodes; - } - - // :: (Pos, ?bool) → bool - // Checks whether the given position is valid in this node. When - // `requireTextblock` is true, only positions inside textblocks are - // considered valid. - }, { - key: "isValidPos", - value: function isValidPos(pos, requireTextblock) { - for (var i = 0, node = this;; i++) { - if (i == pos.path.length) { - if (requireTextblock && !node.isTextblock) return false; - return pos.offset <= node.size; - } else { - var n = pos.path[i]; - if (n >= node.size) return false; - node = node.child(n); - } - } - } - - // :: (Pos, Pos) → {from: Pos, to: Pos} - // Finds the narrowest sibling range (two positions that both point - // into the same node) that encloses the given positions. - }, { - key: "siblingRange", - value: function siblingRange(from, to) { - for (var i = 0, node = this;; i++) { - if (node.isTextblock) { - var path = from.path.slice(0, i - 1), - offset = from.path[i - 1]; - return { from: new _pos.Pos(path, offset), to: new _pos.Pos(path, offset + 1) }; - } - var fromEnd = i == from.path.length, - toEnd = i == to.path.length; - var left = fromEnd ? from.offset : from.path[i]; - var right = toEnd ? to.offset : to.path[i]; - if (fromEnd || toEnd || left != right) { - var path = from.path.slice(0, i); - return { from: new _pos.Pos(path, left), to: new _pos.Pos(path, right + (toEnd ? 0 : 1)) }; - } - node = node.child(left); - } - } - - // :: (?Pos, ?Pos, (node: Node, path: [number], parent: Node)) - // Iterate over all nodes between the given two positions, calling - // the callback with the node, the path towards it, and its parent - // node, as arguments. `from` and `to` may be `null` to denote - // starting at the start of the node or ending at its end. Note that - // the path passed to the callback is mutated as iteration - // continues, so if you want to preserve it, make a copy. - }, { - key: "nodesBetween", - value: function nodesBetween(from, to, f) { - var path = arguments.length <= 3 || arguments[3] === undefined ? [] : arguments[3]; - var parent = arguments.length <= 4 || arguments[4] === undefined ? null : arguments[4]; - - if (f(this, path, parent) === false) return; - this.content.nodesBetween(from, to, f, path, this); - } - - // :: (?Pos, ?Pos, (node: Node, path: [number], start: number, end: number, parent: Node)) - // Calls the given function for each inline node between the two - // given positions. Pass null for `from` or `to` to start or end at - // the start or end of the node. - }, { - key: "inlineNodesBetween", - value: function inlineNodesBetween(from, to, f) { - this.nodesBetween(from, to, function (node, path, parent) { - if (node.isInline) { - var last = path.length - 1; - f(node, path.slice(0, last), path[last], path[last] + node.width, parent); - } - }); - } - - // :: (?Pos, ?Pos) → Node - // Returns a copy of this node containing only the content between - // `from` and `to`. You can pass `null` for either of them to start - // or end at the start or end of the node. - }, { - key: "sliceBetween", - value: function sliceBetween(from, to) { - var depth = arguments.length <= 2 || arguments[2] === undefined ? 0 : arguments[2]; - - return this.copy(this.content.sliceBetween(from, to, depth)); - } - - // :: (Pos) → [Mark] - // Get the marks of the node before the given position or, if that - // position is at the start of a non-empty node, those of the node - // after it. - }, { - key: "marksAt", - value: function marksAt(pos) { - var parent = this.path(pos.path); - if (!parent.isTextblock || !parent.size) return emptyArray; - return parent.chunkBefore(pos.offset || 1).node.marks; - } - - // :: (?Pos, ?Pos, MarkType) → bool - // Test whether a mark of the given type occurs in this document - // between the two given positions. - }, { - key: "rangeHasMark", - value: function rangeHasMark(from, to, type) { - var found = false; - this.nodesBetween(from, to, function (node) { - if (type.isInSet(node.marks)) found = true; - }); - return found; - } - - // :: bool - // True when this is a block (non-inline node) - }, { - key: "toString", - - // :: () → string - // Return a string representation of this node for debugging - // purposes. - value: function toString() { - var name = this.type.name; - if (this.content.size) name += "(" + this.content.toString() + ")"; - return wrapMarks(this.marks, name); - } - - // :: () → Object - // Return a JSON-serializeable representation of this node. - }, { - key: "toJSON", - value: function toJSON() { - var obj = { type: this.type.name }; - for (var _ in this.attrs) { - obj.attrs = this.attrs; - break; - } - if (this.size) obj.content = this.content.toJSON(); - if (this.marks.length) obj.marks = this.marks.map(function (n) { - return n.toJSON(); - }); - return obj; - } - - // This is a hack to be able to treat a node object as an iterator result - }, { - key: "size", - get: function get() { - return this.content.size; - } - - // :: number - // The width of this node. Always 1 for non-text nodes, and the - // length of the text for text nodes. - }, { - key: "width", - get: function get() { - return 1; - } - }, { - key: "textContent", - get: function get() { - return this.content.textContent; - } - - // :: ?Node - // Returns this node's first child, or `null` if there are no - // children. - }, { - key: "firstChild", - get: function get() { - return this.content.firstChild; - } - - // :: ?Node - // Returns this node's last child, or `null` if there are no - // children. - }, { - key: "lastChild", - get: function get() { - return this.content.lastChild; - } - }, { - key: "isBlock", - get: function get() { - return this.type.isBlock; - } - - // :: bool - // True when this is a textblock node, a block node with inline - // content. - }, { - key: "isTextblock", - get: function get() { - return this.type.isTextblock; - } - - // :: bool - // True when this is an inline node (a text node or a node that can - // appear among text). - }, { - key: "isInline", - get: function get() { - return this.type.isInline; - } - - // :: bool - // True when this is a text node. - }, { - key: "isText", - get: function get() { - return this.type.isText; - } - }, { - key: "value", - get: function get() { - return this; - } - - // :: (Schema, Object) → Node - // Deserialize a node from its JSON representation. - }], [{ - key: "sameAttrs", - value: function sameAttrs(a, b) { - if (a == b) return true; - for (var prop in a) { - if (a[prop] !== b[prop]) return false; - }return true; - } - }, { - key: "fromJSON", - value: function fromJSON(schema, json) { - var type = schema.nodeType(json.type); - var content = json.text != null ? json.text : _fragment.Fragment.fromJSON(schema, json.content); - return type.create(json.attrs, content, json.marks && json.marks.map(schema.markFromJSON)); - } - }]); - - return Node; -})(); - -exports.Node = Node; - -if (typeof Symbol != "undefined") { - // :: () → Iterator - // A fragment is iterable, in the ES6 sense. - Node.prototype[Symbol.iterator] = function () { - return this.iter(); - }; -} - -// ;; #forward=Node - -var TextNode = (function (_Node) { - _inherits(TextNode, _Node); - - function TextNode(type, attrs, content, marks) { - _classCallCheck(this, TextNode); - - _get(Object.getPrototypeOf(TextNode.prototype), "constructor", this).call(this, type, attrs, null, marks); - // :: ?string - // For text nodes, this contains the node's text content. - this.text = content; - } - - _createClass(TextNode, [{ - key: "toString", - value: function toString() { - return wrapMarks(this.marks, JSON.stringify(this.text)); - } - }, { - key: "mark", - value: function mark(marks) { - return new TextNode(this.type, this.attrs, this.text, marks); - } - }, { - key: "toJSON", - value: function toJSON() { - var base = _get(Object.getPrototypeOf(TextNode.prototype), "toJSON", this).call(this); - base.text = this.text; - return base; - } - }, { - key: "textContent", - get: function get() { - return this.text; - } - }, { - key: "width", - get: function get() { - return this.text.length; - } - }]); - - return TextNode; -})(Node); - -exports.TextNode = TextNode; - -function wrapMarks(marks, str) { - for (var i = marks.length - 1; i >= 0; i--) { - str = marks[i].type.name + "(" + str + ")"; - }return str; -} - -},{"./fragment":26,"./mark":28,"./pos":30}],30:[function(require,module,exports){ -// ;; Instances of the `Pos` class represent positions in a document. -// A position an array of integers that describe a path to the target -// node (see `Node.path`) and an integer offset into that target node. - -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = (function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); - } - }return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; - }; -})(); - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -var Pos = (function () { - // :: (path: [number], number) - - function Pos(path, offset) { - _classCallCheck(this, Pos); - - // :: [number] The path to the target node. - this.path = path; - // :: number The offset into the target node. - this.offset = offset; - } - - // ;; Return a string representation of the path of the form - // `"0/2:10"`, where the numbers before the colon are the path, and - // the number after it is the offset. - - _createClass(Pos, [{ - key: "toString", - value: function toString() { - return this.path.join("/") + ":" + this.offset; - } - - // :: number - // The length of the position's path. - }, { - key: "max", - - // :: (Pos) → Pos - // Return the greater of two positions. - value: function max(other) { - return this.cmp(other) > 0 ? this : other; - } - - // :: (Pos) → Pos - // Return the lesser of two positions. - }, { - key: "mmin", - value: function mmin(other) { - return this.cmp(other) < 0 ? this : other; - } - - // :: ([number], [number]) → bool - // Compares two paths and returns true when they are the same. - }, { - key: "cmp", - - // :: (Pos) → number - // Compares this position to another position, and returns a number. - // Of this result number, only the sign is significant. It is - // negative if this position is less than the other one, zero if - // they are the same, and positive if this position is greater. - value: function cmp(other) { - if (other == this) return 0; - return Pos.cmp(this.path, this.offset, other.path, other.offset); - } - }, { - key: "shorten", - - // :: (?number, ?number) → Pos - // Create a position pointing into a parent of this position's - // target. When `to` is given, it determines the new length of the - // path. By default, the path becomes one shorter. The `offset` - // parameter can be used to determine where in this parent the - // position points. By default, it points before the old target. You - // can pass a negative or positive integer to move it backward or - // forward (**note**: this method performs no bounds checking). - value: function shorten() { - var to = arguments.length <= 0 || arguments[0] === undefined ? null : arguments[0]; - var offset = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1]; - - if (to >= this.depth) return this; - return Pos.shorten(this.path, to, offset); - } - - // :: (number) → Pos - // Create a position with an offset moved relative to this - // position's offset. For example moving `0/1:10` by `-2` yields - // `0/1:8`. - }, { - key: "move", - value: function move(by) { - return new Pos(this.path, this.offset + by); - } - - // :: (?number) → [number] - // Convert this position to an array of numbers (including its - // offset). Optionally pass an argument to adjust the value of the - // offset. - }, { - key: "toPath", - value: function toPath() { - var move = arguments.length <= 0 || arguments[0] === undefined ? 0 : arguments[0]; - - return this.path.concat(this.offset + move); - } - }, { - key: "extend", - value: function extend(pos) { - var path = this.path.slice(), - add = this.offset; - for (var i = 0; i < pos.path.length; i++) { - path.push(pos.path[i] + add); - add = 0; - } - return new Pos(path, pos.offset + add); - } - - // :: () → Object - // Convert the position to a JSON-safe representation. - }, { - key: "toJSON", - value: function toJSON() { - return this; - } - - // :: ([number], ?number) → Pos - // Build a position from an array of numbers (as in - // [`toPath`](#Pos.toPath)), taking the last element of the array as - // offset and optionally moving it by `move`. - }, { - key: "depth", - get: function get() { - return this.path.length; - } - }], [{ - key: "cmp", - value: function cmp(pathA, offsetA, pathB, offsetB) { - var lenA = pathA.length, - lenB = pathB.length; - for (var i = 0, end = Math.min(lenA, lenB); i < end; i++) { - var diff = pathA[i] - pathB[i]; - if (diff != 0) return diff; - } - if (lenA > lenB) return offsetB <= pathA[i] ? 1 : -1;else if (lenB > lenA) return offsetA <= pathB[i] ? -1 : 1;else return offsetA - offsetB; - } - }, { - key: "samePath", - value: function samePath(pathA, pathB) { - if (pathA.length != pathB.length) return false; - for (var i = 0; i < pathA.length; i++) { - if (pathA[i] !== pathB[i]) return false; - }return true; - } - }, { - key: "shorten", - value: function shorten(path) { - var to = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; - var offset = arguments.length <= 2 || arguments[2] === undefined ? 0 : arguments[2]; - - if (to == null) to = path.length - 1; - return new Pos(path.slice(0, to), path[to] + offset); - } - }, { - key: "from", - value: function from(array) { - var move = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1]; - - if (!array.length) throw new Error("Can't create a pos from an empty array"); - return new Pos(array.slice(0, array.length - 1), array[array.length - 1] + move); - } - - // :: (Object) → Pos - // Create a position from a JSON representation. - }, { - key: "fromJSON", - value: function fromJSON(json) { - return new Pos(json.path, json.offset); - } - }]); - - return Pos; -})(); - -exports.Pos = Pos; - -},{}],31:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _slicedToArray = (function () { - function sliceIterator(arr, i) { - var _arr = [];var _n = true;var _d = false;var _e = undefined;try { - for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { - _arr.push(_s.value);if (i && _arr.length === i) break; - } - } catch (err) { - _d = true;_e = err; - } finally { - try { - if (!_n && _i["return"]) _i["return"](); - } finally { - if (_d) throw _e; - } - }return _arr; - }return function (arr, i) { - if (Array.isArray(arr)) { - return arr; - } else if (Symbol.iterator in Object(arr)) { - return sliceIterator(arr, i); - } else { - throw new TypeError("Invalid attempt to destructure non-iterable instance"); - } - }; -})(); - -var _createClass = (function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); - } - }return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; - }; -})(); - -var _get = function get(_x2, _x3, _x4) { - var _again = true;_function: while (_again) { - var object = _x2, - property = _x3, - receiver = _x4;_again = false;if (object === null) object = Function.prototype;var desc = Object.getOwnPropertyDescriptor(object, property);if (desc === undefined) { - var parent = Object.getPrototypeOf(object);if (parent === null) { - return undefined; - } else { - _x2 = parent;_x3 = property;_x4 = receiver;_again = true;desc = parent = undefined;continue _function; - } - } else if ("value" in desc) { - return desc.value; - } else { - var getter = desc.get;if (getter === undefined) { - return undefined; - }return getter.call(receiver); - } - } -}; - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -function _inherits(subClass, superClass) { - if (typeof superClass !== "function" && superClass !== null) { - throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); - }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; -} - -var _node = require("./node"); - -var _fragment = require("./fragment"); - -var _mark = require("./mark"); - -var _utilError = require("../util/error"); - -// ;; #toc=false The exception type used to signal schema-related -// errors. - -var SchemaError = (function (_ProseMirrorError) { - _inherits(SchemaError, _ProseMirrorError); - - function SchemaError() { - _classCallCheck(this, SchemaError); - - _get(Object.getPrototypeOf(SchemaError.prototype), "constructor", this).apply(this, arguments); - } - - return SchemaError; -})(_utilError.ProseMirrorError); - -exports.SchemaError = SchemaError; - -function findKinds(type, name, schema, override) { - function set(sub, sup) { - if (sub in schema.kinds) { - if (schema.kinds[sub] == sup) return; - SchemaError.raise("Inconsistent superkinds for kind " + sub + ": " + sup + " and " + schema.kinds[sub]); - } - if (schema.subKind(sub, sup)) SchemaError.raise("Conflicting kind hierarchy through " + sub + " and " + sup); - schema.kinds[sub] = sup; - } - - for (var cur = type;; cur = Object.getPrototypeOf(cur)) { - var curKind = override != null && cur == type ? override : cur.kind; - if (curKind != null) { - var _$$exec = /^(.*?)(\.)?$/.exec(curKind); - - var _$$exec2 = _slicedToArray(_$$exec, 3); - - var _ = _$$exec2[0]; - var kind = _$$exec2[1]; - var end = _$$exec2[2]; - - if (kind) { - set(name, kind); - name = kind; - } - if (end) { - set(name, null); - return; - } - } - } -} - -// ;; Node types are objects allocated once per `Schema` -// and used to tag `Node` instances with a type. They are -// instances of sub-types of this class, and contain information about -// the node type (its name, its allowed attributes, methods for -// serializing it to various formats, information to guide -// deserialization, and so on). - -var NodeType = (function () { - function NodeType(name, contains, attrs, schema) { - _classCallCheck(this, NodeType); - - // :: string - // The name the node type has in this schema. - this.name = name; - // :: ?string - // The kind of nodes this node may contain. `null` means it's a - // leaf node. - this.contains = contains; - // :: Object - // The attributes allowed on this node type. - this.attrs = attrs; - // :: Schema - // A link back to the `Schema` the node type belongs to. - this.schema = schema; - this.defaultAttrs = getDefaultAttrs(attrs); - } - - // :: Object - // The default set of attributes to associate with a given type. Note - // that schemas may add additional attributes to instances of the - // type. - - // :: bool - // True if this is a block type. - - _createClass(NodeType, [{ - key: "canContainFragment", - - // :: (Fragment) → bool - // Test whether the content of the given fragment could be contained - // in this node type. - value: function canContainFragment(fragment) { - var _this = this; - - var ok = true; - fragment.forEach(function (n) { - if (!_this.canContain(n)) ok = false; - }); - return ok; - } - - // :: (Node) → bool - // Test whether the given node could be contained in this node type. - }, { - key: "canContain", - value: function canContain(node) { - if (!this.canContainType(node.type)) return false; - for (var i = 0; i < node.marks.length; i++) { - if (!this.canContainMark(node.marks[i])) return false; - }return true; - } - - // :: (Mark) → bool - // Test whether this node type can contain children with the given - // mark. - }, { - key: "canContainMark", - value: function canContainMark(mark) { - var contains = this.containsMarks; - if (contains === true) return true; - if (contains) for (var i = 0; i < contains.length; i++) { - if (contains[i] == mark.name) return true; - }return false; - } - - // :: (NodeType) → bool - // Test whether this node type can contain nodes of the given node - // type. - }, { - key: "canContainType", - value: function canContainType(type) { - return this.schema.subKind(type.name, this.contains); - } - - // :: (NodeType) → bool - // Test whether the nodes that can be contained in the given node - // type are a sub-type of the nodes that can be contained in this - // type. - }, { - key: "canContainContent", - value: function canContainContent(type) { - return this.schema.subKind(type.contains, this.contains); - } - - // :: (NodeType) → [NodeType] - // Find a set of intermediate node types, possibly empty, that have - // to be inserted between this type and `other` to put a node of - // type `other` into this type. - }, { - key: "findConnection", - value: function findConnection(other) { - // FIXME somehow define an order in which these are tried - if (this.canContainType(other)) return []; - - var seen = Object.create(null); - var active = [{ from: this, via: [] }]; - while (active.length) { - var current = active.shift(); - for (var _name in this.schema.nodes) { - var type = this.schema.nodes[_name]; - if (type.defaultAttrs && !(type.contains in seen) && current.from.canContainType(type)) { - var via = current.via.concat(type); - if (type.canContainType(other)) return via; - active.push({ from: type, via: via }); - seen[type.contains] = true; - } - } - } - } - }, { - key: "buildAttrs", - value: function buildAttrs(attrs, content) { - if (!attrs && this.defaultAttrs) return this.defaultAttrs;else return _buildAttrs(this.attrs, attrs, this, content); - } - - // :: (?Object, ?Fragment, ?[Mark]) → Node - // Create a `Node` of this type. The given attributes are - // checked and defaulted (you can pass `null` to use the type's - // defaults entirely, if no required attributes exist). `content` - // may be a `Fragment`, a node, an array of nodes, or - // `null`. Similarly `marks` may be `null` to default to the empty - // set of marks. - }, { - key: "create", - value: function create(attrs, content, marks) { - return new _node.Node(this, this.buildAttrs(attrs, content), _fragment.Fragment.from(content), _mark.Mark.setFrom(marks)); - } - }, { - key: "createAutoFill", - value: function createAutoFill(attrs, content, marks) { - if ((!content || content.length == 0) && !this.canBeEmpty) content = this.defaultContent(); - return this.create(attrs, content, marks); - } - - // :: bool - // Controls whether this node is allowed to be empty. - }, { - key: "isBlock", - get: function get() { - return false; - } - - // :: bool - // True if this is a textblock type, a block that contains inline - // content. - }, { - key: "isTextblock", - get: function get() { - return false; - } - - // :: bool - // True if this is an inline type. - }, { - key: "isInline", - get: function get() { - return false; - } - - // :: bool - // True if this is the text node type. - }, { - key: "isText", - get: function get() { - return false; - } - - // :: bool - // Controls whether nodes of this type can be selected (as a user - // node selection). - }, { - key: "selectable", - get: function get() { - return true; - } - - // :: bool - // Controls whether this node type is locked. - }, { - key: "locked", - get: function get() { - return false; - } - - // :: string - // Controls the _kind_ of the node, which is used to determine valid - // parent/child relations. Can be a word, which adds that kind to - // the set of kinds of the superclass, a word followed by a dot, to - // ignore the kinds of the superclass and use only that word (along - // with the node's name) as kind, or only a dot, in which case the - // only kind the node has is its own name. - }, { - key: "canBeEmpty", - get: function get() { - return true; - } - }, { - key: "containsMarks", - - // :: union - // The mark types that child nodes of this node may have. `false` - // means no marks, `true` means any mark, and an array of strings - // can be used to explicitly list the allowed mark types. - get: function get() { - return false; - } - }], [{ - key: "compile", - value: function compile(types, schema) { - var result = Object.create(null); - for (var _name2 in types) { - var info = types[_name2]; - var type = info.type || SchemaError.raise("Missing node type for " + _name2); - findKinds(type, _name2, schema, info.kind); - var contains = "contains" in info ? info.contains : type.contains; - var attrs = type.attributes; - if (info.attributes) { - attrs = copyObj(attrs); - for (var aName in info.attributes) attrs[aName] = info.attributes[aName]; - } - result[_name2] = new type(_name2, contains, attrs, schema); - } - for (var _name3 in result) { - var contains = result[_name3].contains; - if (contains && !(contains in schema.kinds)) SchemaError.raise("Node type " + _name3 + " is specified to contain non-existing kind " + contains); - } - if (!result.doc) SchemaError.raise("Every schema needs a 'doc' type"); - if (!result.text) SchemaError.raise("Every schema needs a 'text' type"); - - return result; - } - - // :: (string, *) - // Register an element in this type's registry. That is, add `value` - // to the array associated with `name` in the registry stored in - // type's `prototype`. This is mostly used to attach things like - // commands and parsing strategies to node types. See `Schema.registry`. - }, { - key: "register", - value: function register(name, value) { - var registry = this.prototype.hasOwnProperty("registry") ? this.prototype.registry : this.prototype.registry = Object.create(null);(registry[name] || (registry[name] = [])).push(value); - } - }, { - key: "kind", - get: function get() { - return "."; - } - }]); - - return NodeType; -})(); - -exports.NodeType = NodeType; -NodeType.attributes = {}; - -// ;; #toc=false Base type for block nodetypes. - -var Block = (function (_NodeType) { - _inherits(Block, _NodeType); - - function Block() { - _classCallCheck(this, Block); - - _get(Object.getPrototypeOf(Block.prototype), "constructor", this).apply(this, arguments); - } - - // ;; #toc=false Base type for textblock node types. - - _createClass(Block, [{ - key: "defaultContent", - value: function defaultContent() { - var inner = this.schema.defaultTextblockType().create(); - var conn = this.findConnection(inner.type); - if (!conn) SchemaError.raise("Can't create default content for " + this.name); - for (var i = conn.length - 1; i >= 0; i--) { - inner = conn[i].create(null, inner); - }return _fragment.Fragment.from(inner); - } - }, { - key: "isBlock", - get: function get() { - return true; - } - }, { - key: "canBeEmpty", - get: function get() { - return this.contains == null; - } - }], [{ - key: "contains", - get: function get() { - return "block"; - } - }, { - key: "kind", - get: function get() { - return "block."; - } - }]); - - return Block; -})(NodeType); - -exports.Block = Block; - -var Textblock = (function (_Block) { - _inherits(Textblock, _Block); - - function Textblock() { - _classCallCheck(this, Textblock); - - _get(Object.getPrototypeOf(Textblock.prototype), "constructor", this).apply(this, arguments); - } - - // ;; #toc=false Base type for inline node types. - - _createClass(Textblock, [{ - key: "containsMarks", - get: function get() { - return true; - } - }, { - key: "isTextblock", - get: function get() { - return true; - } - }, { - key: "canBeEmpty", - get: function get() { - return true; - } - }], [{ - key: "contains", - get: function get() { - return "inline"; - } - }]); - - return Textblock; -})(Block); - -exports.Textblock = Textblock; - -var Inline = (function (_NodeType2) { - _inherits(Inline, _NodeType2); - - function Inline() { - _classCallCheck(this, Inline); - - _get(Object.getPrototypeOf(Inline.prototype), "constructor", this).apply(this, arguments); - } - - // ;; #toc=false The text node type. - - _createClass(Inline, [{ - key: "isInline", - get: function get() { - return true; - } - }], [{ - key: "contains", - get: function get() { - return null; - } - }, { - key: "kind", - get: function get() { - return "inline."; - } - }]); - - return Inline; -})(NodeType); - -exports.Inline = Inline; - -var Text = (function (_Inline) { - _inherits(Text, _Inline); - - function Text() { - _classCallCheck(this, Text); - - _get(Object.getPrototypeOf(Text.prototype), "constructor", this).apply(this, arguments); - } - - // Attribute descriptors - - // ;; Attributes are named strings associated with nodes and marks. - // Each node type or mark type has a fixed set of attributes, which - // instances of this class are used to control. - - _createClass(Text, [{ - key: "create", - value: function create(attrs, content, marks) { - return new _node.TextNode(this, this.buildAttrs(attrs, content), content, marks); - } - }, { - key: "selectable", - get: function get() { - return false; - } - }, { - key: "isText", - get: function get() { - return true; - } - }]); - - return Text; -})(Inline); - -exports.Text = Text; - -var Attribute = (function () { - // :: (Object) - // Create an attribute. `options` is an object containing the - // settings for the attributes. The following settings are - // supported: - // - // **`default`**: `?string` - // : The default value for this attribute, to choose when no - // explicit value is provided. - // - // **`compute`**: `?(Fragment) → string` - // : A function that computes a default value for the attribute from - // the node's content. - // - // Attributes that have no default or compute property must be - // provided whenever a node or mark of a type that has them is - // created. - - function Attribute() { - var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; - - _classCallCheck(this, Attribute); - - this["default"] = options["default"]; - this.compute = options.compute; - this.registry = Object.create(null); - } - - // Marks - - // ;; Like nodes, marks (which are associated with nodes to signify - // things like emphasis or being part of a link) are tagged with type - // objects, which are instantiated once per `Schema`. - - // :: (string, *) - // Register a value in this attribute's registry. See - // `NodeType.register` and `Schema.registry`. - - _createClass(Attribute, [{ - key: "register", - value: function register(name, value) { - ;(this.registry[name] || (this.registry[name] = [])).push(value); - } - }]); - - return Attribute; -})(); - -exports.Attribute = Attribute; - -var MarkType = (function () { - function MarkType(name, attrs, rank, schema) { - _classCallCheck(this, MarkType); - - // :: string - // The name of the mark type. - this.name = name; - // :: Object - // The attributes supported by this type of mark. - this.attrs = attrs; - this.rank = rank; - // :: Schema - // The schema that this mark type instance is part of. - this.schema = schema; - var defaults = getDefaultAttrs(this.attrs); - this.instance = defaults && new _mark.Mark(this, defaults); - } - - // :: Object - // The default set of attributes to associate with a mark type. By - // default, this returns an empty object. - - // :: number - // Mark type ranks are used to determine the order in which mark - // arrays are sorted. (If multiple mark types end up with the same - // rank, they still get a fixed order in the schema, but there's no - // guarantee what it will be.) - - _createClass(MarkType, [{ - key: "create", - - // :: (Object) → Mark - // Create a mark of this type. `attrs` may be `null` or an object - // containing only some of the mark's attributes. The others, if - // they have defaults, will be added. - value: function create(attrs) { - if (!attrs && this.instance) return this.instance; - return new _mark.Mark(this, _buildAttrs(this.attrs, attrs, this)); - } - }, { - key: "removeFromSet", - - // :: ([Mark]) → [Mark] - // When there is a mark of this type in the given set, a new set - // without it is returned. Otherwise, the input set is returned. - value: function removeFromSet(set) { - for (var i = 0; i < set.length; i++) if (set[i].type == this) return set.slice(0, i).concat(set.slice(i + 1)); - return set; - } - - // :: ([Mark]) → bool - // Tests whether there is a mark of this type in the given set. - }, { - key: "isInSet", - value: function isInSet(set) { - for (var i = 0; i < set.length; i++) { - if (set[i].type == this) return set[i]; - } - } - }], [{ - key: "getOrder", - value: function getOrder(marks) { - var sorted = []; - for (var _name4 in marks) { - sorted.push({ name: _name4, rank: marks[_name4].type.rank }); - }sorted.sort(function (a, b) { - return a.rank - b.rank; - }); - var ranks = Object.create(null); - for (var i = 0; i < sorted.length; i++) { - ranks[sorted[i].name] = i; - }return ranks; - } - }, { - key: "compile", - value: function compile(marks, schema) { - var order = this.getOrder(marks); - var result = Object.create(null); - for (var _name5 in marks) { - var info = marks[_name5]; - var attrs = info.attributes || info.type.attributes; - result[_name5] = new info.type(_name5, attrs, order[_name5], schema); - } - return result; - } - }, { - key: "rank", - get: function get() { - return 50; - } - }]); - - return MarkType; -})(); - -exports.MarkType = MarkType; -MarkType.attributes = {}; - -// :: (string, *) -// Register a metadata element for this mark type. See also -// `NodeType.register`. -MarkType.register = NodeType.register; - -// Schema specifications are data structures that specify a schema -- -// a set of node types, their names, attributes, and nesting behavior. - -function copyObj(obj, f) { - var result = Object.create(null); - for (var prop in obj) { - result[prop] = f ? f(obj[prop]) : obj[prop]; - }return result; -} - -function ensureWrapped(obj) { - return obj instanceof Function ? { type: obj } : obj; -} - -function overlayObj(obj, overlay) { - var copy = copyObj(obj); - for (var _name6 in overlay) { - var info = ensureWrapped(overlay[_name6]); - if (info == null) { - delete copy[_name6]; - } else if (info.type) { - copy[_name6] = info; - } else { - var existing = copy[_name6] = copyObj(copy[_name6]); - for (var prop in info) { - existing[prop] = info[prop]; - } - } - } - return copy; -} - -// ;; A schema specification is a blueprint for an actual -// `Schema`. It maps names to node and mark types, along -// with extra information, such as additional attributes and changes -// to node kinds and relations. -// -// A specification consists of an object that maps node names to node -// type constructors and another similar object mapping mark names to -// mark type constructors. -// -// For flexibility and reusability, node and mark type classes do not -// declare their own name. Instead, each schema that includes them can -// assign a name to them, as well as override their -// [kind](#NodeType.kind) and [contained kind](#NodeType.contains), or -// adding extra [attributes](#NodeType.attributes). - -var SchemaSpec = (function () { - // :: (?Object<{type: NodeType}>, ?Object<{type: MarkType}>) - // Create a schema specification from scratch. The arguments map - // node names to node type constructors and mark names to mark type - // constructors. Their property value should be either the type - // constructors themselves, or objects with a type constructor under - // their `type` property, and optionally these other properties: - // - // **`contains`**`: string` - // : Only valid for `nodes`. The [kind](#NodeType.kind) of the - // nodes that this node can contain in this schema. - // - // **`kind`**`: string` - // : Only valid for `nodes`. Overrides the kind of this node in - // this schema. Same format as `NodeType.kind`. - // - // **`attributes`**`: Object` - // : Extra attributes to attach to this node in this schema. - - function SchemaSpec(nodes, marks) { - _classCallCheck(this, SchemaSpec); - - this.nodes = nodes ? copyObj(nodes, ensureWrapped) : Object.create(null); - this.marks = marks ? copyObj(marks, ensureWrapped) : Object.create(null); - } - - // For node types where all attrs have a default value (or which don't - // have any attributes), build up a single reusable default attribute - // object, and use it for all nodes that don't specify specific - // attributes. - - // :: (?Object, ?Object) → SchemaSpec - // Base a new schema spec on this one by specifying nodes and marks - // to add, change, or remove. - // - // When `nodes` is passed, it should be an object mapping type names - // to either `null`, to delete the type of that name, to a - // `NodeType`, to add or replace the node type of that name, or to - // an object containing [extension - // properties](#SchemaSpec_constructor), to add to the existing - // description of that node type. - // - // Similarly, `marks` can be an object to add, change, or remove - // marks in the schema. - - _createClass(SchemaSpec, [{ - key: "update", - value: function update(nodes, marks) { - return new SchemaSpec(nodes ? overlayObj(this.nodes, nodes) : this.nodes, marks ? overlayObj(this.marks, marks) : this.marks); - } - - // :: (?union, string, Attribute) → SchemaSpec - // Create a new schema spec with attributes added to selected node - // types. `filter` can be `null`, to add the attribute to all node - // types, a string, to add it only to the named node type, or a - // predicate function, to add it to node types that pass the - // predicate. - // - // This attribute will be added alongside the node type's [default - // attributes](#NodeType.attributes). - }, { - key: "addAttribute", - value: function addAttribute(filter, attrName, attr) { - var copy = copyObj(this.nodes); - for (var _name7 in copy) { - if (typeof filter == "string" ? filter == _name7 : typeof filter == "function" ? filter(_name7, copy[_name7]) : filter ? filter == copy[_name7] : true) { - var info = copy[_name7] = copyObj(copy[_name7]);(info.attributes || (info.attributes = Object.create(null)))[attrName] = attr; - } - } - return new SchemaSpec(copy, this.marks); - } - }]); - - return SchemaSpec; -})(); - -exports.SchemaSpec = SchemaSpec; -function getDefaultAttrs(attrs) { - var defaults = Object.create(null); - for (var attrName in attrs) { - var attr = attrs[attrName]; - if (attr["default"] == null) return null; - defaults[attrName] = attr["default"]; - } - return defaults; -} - -function _buildAttrs(attrSpec, attrs, arg1, arg2) { - var built = Object.create(null); - for (var _name8 in attrSpec) { - var value = attrs && attrs[_name8]; - if (value == null) { - var attr = attrSpec[_name8]; - if (attr["default"] != null) value = attr["default"];else if (attr.compute) value = attr.compute(arg1, arg2);else SchemaError.raise("No value supplied for attribute " + _name8); - } - built[_name8] = value; - } - return built; -} - -// ;; Each document is based on a single schema, which provides the -// node and mark types that it is made up of (which, in turn, -// determine the structure it is allowed to have). - -var Schema = (function () { - // :: (SchemaSpec) - // Construct a schema from a specification. - - function Schema(spec) { - _classCallCheck(this, Schema); - - // :: SchemaSpec - // The specification on which the schema is based. - this.spec = spec; - this.kinds = Object.create(null); - // :: Object - // An object mapping the schema's node names to node type objects. - this.nodes = NodeType.compile(spec.nodes, this); - // :: Object - // A map from mark names to mark type objects. - this.marks = MarkType.compile(spec.marks, this); - // :: Object - // An object for storing whatever values modules may want to - // compute and cache per schema. (If you want to store something - // in it, try to use property names unlikely to clash.) - this.cached = Object.create(null); - - this.node = this.node.bind(this); - this.text = this.text.bind(this); - this.nodeFromJSON = this.nodeFromJSON.bind(this); - this.markFromJSON = this.markFromJSON.bind(this); - } - - // :: (union, ?Object, ?union, ?[Mark]) → Node - // Create a node in this schema. The `type` may be a string or a - // `NodeType` instance. Attributes will be extended - // with defaults, `content` may be a `Fragment`, - // `null`, a `Node`, or an array of nodes. - // - // When creating a text node, `content` should be a string and is - // interpreted as the node's text. - // - // This method is bound to the Schema, meaning you don't have to - // call it as a method, but can pass it to higher-order functions - // and such. - - _createClass(Schema, [{ - key: "node", - value: function node(type, attrs, content, marks) { - if (typeof type == "string") type = this.nodeType(type);else if (!(type instanceof NodeType)) SchemaError.raise("Invalid node type: " + type);else if (type.schema != this) SchemaError.raise("Node type from different schema used (" + type.name + ")"); - - return type.create(attrs, content, marks); - } - - // :: (string, ?[Mark]) → Node - // Create a text node in the schema. This method is bound to the Schema. - }, { - key: "text", - value: function text(_text, marks) { - return this.nodes.text.create(null, _text, _mark.Mark.setFrom(marks)); - } - - // :: () → ?NodeType - // Return the default textblock type for this schema, or `null` if - // it does not contain a node type with a `defaultTextblock` - // property. - }, { - key: "defaultTextblockType", - value: function defaultTextblockType() { - var cached = this.cached.defaultTextblockType; - if (cached !== undefined) return cached; - for (var _name9 in this.nodes) { - if (this.nodes[_name9].defaultTextblock) return this.cached.defaultTextblockType = this.nodes[_name9]; - } - return this.cached.defaultTextblockType = null; - } - - // :: (string, ?Object) → Mark - // Create a mark with the named type - }, { - key: "mark", - value: function mark(name, attrs) { - var spec = this.marks[name] || SchemaError.raise("No mark named " + name); - return spec.create(attrs); - } - - // :: (Object) → Node - // Deserialize a node from its JSON representation. This method is - // bound. - }, { - key: "nodeFromJSON", - value: function nodeFromJSON(json) { - return _node.Node.fromJSON(this, json); - } - - // :: (Object) → Mark - // Deserialize a mark from its JSON representation. This method is - // bound. - }, { - key: "markFromJSON", - value: function markFromJSON(json) { - if (typeof json == "string") return this.mark(json); - return this.mark(json._, json); - } - - // :: (string) → NodeType - // Get the `NodeType` associated with the given name in - // this schema, or raise an error if it does not exist. - }, { - key: "nodeType", - value: function nodeType(name) { - return this.nodes[name] || SchemaError.raise("Unknown node type: " + name); - } - - // :: (string, string) → bool - // Test whether a node kind is a sub-kind of another kind. - }, { - key: "subKind", - value: function subKind(sub, sup) { - for (;;) { - if (sub == sup) return true; - sub = this.kinds[sub]; - if (!sub) return false; - } - } - - // :: (string, (value: *, source: union)) - // Retrieve all registered items under the given name from this - // schema. The given function will be called with each item and, as - // a second argument, the element—node type, mark type, or - // attribute—that it was associated with. - }, { - key: "registry", - value: function registry(name, f) { - var attrsSeen = []; - for (var i = 0; i < 2; i++) { - var obj = i ? this.marks : this.nodes; - for (var tname in obj) { - var type = obj[tname]; - if (type.constructor.prototype.hasOwnProperty("registry")) { - var reg = type.registry[name]; - if (reg) for (var j = 0; j < reg.length; j++) { - f(reg[j], type); - } - } - for (var aname in type.attrs) { - var attr = type.attrs[aname], - reg = attr.registry[name]; - if (reg && attrsSeen.indexOf(attr) == -1) { - attrsSeen.push(attr); - for (var j = 0; j < reg.length; j++) { - f(reg[j], attr); - } - } - } - } - } - } - }]); - - return Schema; -})(); - -exports.Schema = Schema; - -},{"../util/error":48,"./fragment":26,"./mark":28,"./node":29}],32:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = (function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); - } - }return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; - }; -})(); - -exports.fromDOM = fromDOM; -exports.fromHTML = fromHTML; - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -var _model = require("../model"); - -var _index = require("./index"); - -// :: (Schema, DOMNode, ?Object) → Node -// Parse document from the content of a DOM node. To pass an explicit -// parent document (for example, when not in a browser window -// environment, where we simply use the global document), pass it as -// the `document` property of `options`. - -function fromDOM(schema, dom, options) { - if (!options) options = {}; - var context = new DOMParseState(schema, options.topNode || schema.node("doc"), options); - var start = options.from ? dom.childNodes[options.from] : dom.firstChild; - var end = options.to != null && dom.childNodes[options.to] || null; - context.addAll(start, end, true); - var doc = undefined; - while (context.stack.length) doc = context.leave(); - return doc; -} - -// ;; #path=DOMParseSpec #kind=interface #toc=false -// To define the way [node](#NodeType) and [mark](#MarkType) types are -// parsed, you can associate one or more DOM parsing specifications to -// them using the [`register`](#NodeType.register) method with the -// `parseDOM` property name. Each of them defines a parsing strategy -// for a certain type of DOM node. -// -// Note that `Attribute`s may also contain a `parseDOM` property, -// which should _not_ be a `DOMParseSpec`, but simply a function that -// computes the attribute's value from a DOM node. - -// :: ?string #path=DOMParseSpec.tag -// The (lower-case) tag name for which to activate this parser. When -// not given, it is activated for all nodes. - -// :: ?number #path=DOMParseSpec.rank -// The precedence of this parsing strategy. Should be a number between -// 0 and 100, which determines when this parser gets a chance relative -// to others that apply to the node (low ranks go first). Defaults to -// 50. - -// :: union #path=DOMParseSpec.parse -// The function that, given a DOM node, parses it, updating the parse -// state. It should return (the exact value) `false` when it wants to -// indicate that it was not able to parse this node. This function is -// called in such a way that `this` is bound to the type that the -// parse spec was associated with. -// -// When this is set to the string `"block"`, the content of the DOM -// node is parsed as the content in a node of the type that this spec -// was associated with. -// -// When set to the string `"mark"`, the content of the DOM node is -// parsed with an instance of the mark that this spec was associated -// with added to their marks. - -(0, _index.defineSource)("dom", fromDOM); - -// :: (Schema, string, ?Object) → Node -// Parses the HTML into a DOM, and then calls through to `fromDOM`. - -function fromHTML(schema, html, options) { - var wrap = (options && options.document || window.document).createElement("div"); - wrap.innerHTML = html; - return fromDOM(schema, wrap, options); -} - -(0, _index.defineSource)("html", fromHTML); - -var blockElements = { - address: true, article: true, aside: true, blockquote: true, canvas: true, - dd: true, div: true, dl: true, fieldset: true, figcaption: true, figure: true, - footer: true, form: true, h1: true, h2: true, h3: true, h4: true, h5: true, - h6: true, header: true, hgroup: true, hr: true, li: true, noscript: true, ol: true, - output: true, p: true, pre: true, section: true, table: true, tfoot: true, ul: true -}; - -var noMarks = []; - -// ;; #toc=false A state object used to track context during a parse, -// and to expose methods to custom parsing functions. - -var DOMParseState = (function () { - function DOMParseState(schema, topNode, options) { - _classCallCheck(this, DOMParseState); - - // :: Object The options passed to this parse. - this.options = options || {}; - // :: Schema The schema that we are parsing into. - this.schema = schema; - this.stack = []; - this.marks = noMarks; - this.closing = false; - this.enter(topNode.type, topNode.attrs); - this.nodeInfo = nodeInfo(schema); - } - - _createClass(DOMParseState, [{ - key: "parseAttrs", - value: function parseAttrs(dom, type, attrs) { - for (var attr in type.attrs) { - var desc = type.attrs[attr]; - if (desc.parseDOM && (!attrs || !Object.prototype.hasOwnProperty.call(attrs, attr))) { - var value = desc.parseDOM(dom, this.options, desc, type); - if (value != null) { - if (!attrs) attrs = {}; - attrs[attr] = value; - } - } - } - return attrs; - } - }, { - key: "addDOM", - value: function addDOM(dom) { - if (dom.nodeType == 3) { - // FIXME define a coherent strategy for dealing with trailing, leading, and multiple spaces (this isn't one) - var value = dom.nodeValue; - var _top = this.top, - last = undefined; - if (/\S/.test(value) || _top.type.isTextblock) { - value = value.replace(/\s+/g, " "); - if (/^\s/.test(value) && (last = _top.content[_top.content.length - 1]) && last.type.name == "text" && /\s$/.test(last.text)) value = value.slice(1); - if (value) this.insert(this.schema.text(value, this.marks)); - } - } else if (dom.nodeType != 1 || dom.hasAttribute("pm-ignore")) { - // Ignore non-text non-element nodes - } else if (!this.parseNodeType(dom)) { - this.addAll(dom.firstChild, null); - var _name = dom.nodeName.toLowerCase(); - if (blockElements.hasOwnProperty(_name) && this.top.type == this.schema.defaultTextblockType()) this.closing = true; - } - } - }, { - key: "tryParsers", - value: function tryParsers(parsers, dom) { - if (parsers) for (var i = 0; i < parsers.length; i++) { - var parser = parsers[i]; - if (parser.parse.call(parser.type, dom, this) !== false) return true; - } - } - }, { - key: "parseNodeType", - value: function parseNodeType(dom) { - return this.tryParsers(this.nodeInfo[dom.nodeName.toLowerCase()], dom) || this.tryParsers(this.nodeInfo._, dom); - } - }, { - key: "addAll", - value: function addAll(from, to, sync) { - var stack = sync && this.stack.slice(); - for (var dom = from; dom != to; dom = dom.nextSibling) { - this.addDOM(dom); - if (sync && blockElements.hasOwnProperty(dom.nodeName.toLowerCase())) this.sync(stack); - } - } - }, { - key: "doClose", - value: function doClose() { - if (!this.closing || this.stack.length < 2) return; - var left = this.leave(); - this.enter(left.type, left.attrs); - this.closing = false; - } - }, { - key: "insert", - value: function insert(node) { - if (this.top.type.canContain(node)) { - this.doClose(); - } else { - for (var i = this.stack.length - 1; i >= 0; i--) { - var route = this.stack[i].type.findConnection(node.type); - if (!route) continue; - if (i == this.stack.length - 1) { - this.doClose(); - } else { - while (this.stack.length > i + 1) this.leave(); - } - for (var j = 0; j < route.length; j++) { - this.enter(route[j]); - }if (this.marks.length) this.marks = noMarks; - break; - } - } - this.top.content.push(node); - return node; - } - - // :: (DOMNode, NodeType, ?Object, [Node]) → Node - // Insert a node of the given type, with the given content, based on - // `dom`, at the current position in the document. - }, { - key: "insertFrom", - value: function insertFrom(dom, type, attrs, content) { - return this.insert(type.createAutoFill(this.parseAttrs(dom, type, attrs), content, this.marks)); - } - }, { - key: "enter", - value: function enter(type, attrs) { - if (this.marks.length) this.marks = noMarks; - this.stack.push({ type: type, attrs: attrs, content: [] }); - } - }, { - key: "enterFrom", - value: function enterFrom(dom, type, attrs) { - this.enter(type, this.parseAttrs(dom, type, attrs)); - } - }, { - key: "leave", - value: function leave() { - var top = this.stack.pop(); - var node = top.type.createAutoFill(top.attrs, top.content); - if (this.stack.length) this.insert(node); - return node; - } - }, { - key: "sync", - value: function sync(stack) { - while (this.stack.length > stack.length) this.leave(); - for (;;) { - var n = this.stack.length - 1, - one = this.stack[n], - two = stack[n]; - if (one.type == two.type && _model.Node.sameAttrs(one.attrs, two.attrs)) break; - this.leave(); - } - while (stack.length > this.stack.length) { - var add = stack[this.stack.length]; - this.enter(add.type, add.attrs); - } - if (this.marks.length) this.marks = noMarks; - this.closing = false; - } - - // :: (DOMNode, NodeType, ?Object) - // Parse the contents of `dom` as children of a node of the given - // type. - }, { - key: "wrapIn", - value: function wrapIn(dom, type, attrs) { - this.enterFrom(dom, type, attrs); - this.addAll(dom.firstChild, null, true); - this.leave(); - } - - // :: (DOMNode, Mark) - // Parse the contents of `dom`, with `mark` added to the set of - // current marks. - }, { - key: "wrapMark", - value: function wrapMark(dom, mark) { - var old = this.marks; - this.marks = (mark.instance || mark).addToSet(old); - this.addAll(dom.firstChild, null); - this.marks = old; - } - }, { - key: "top", - get: function get() { - return this.stack[this.stack.length - 1]; - } - }]); - - return DOMParseState; -})(); - -function nodeInfo(schema) { - return schema.cached.parseDOMNodes || (schema.cached.parseDOMNodes = summarizeNodeInfo(schema)); -} - -function summarizeNodeInfo(schema) { - var tags = Object.create(null); - tags._ = []; - schema.registry("parseDOM", function (info, type) { - var tag = info.tag || "_"; - var parse = info.parse; - if (parse == "block") parse = function (dom, state) { - state.wrapIn(dom, this); - };else if (parse == "mark") parse = function (dom, state) { - state.wrapMark(dom, this); - };(tags[tag] || (tags[tag] = [])).push({ - type: type, parse: parse, - rank: info.rank == null ? 50 : info.rank - }); - }); - for (var tag in tags) { - tags[tag].sort(function (a, b) { - return a.rank - b.rank; - }); - }return tags; -} - -_model.Paragraph.register("parseDOM", { tag: "p", parse: "block" }); - -_model.BlockQuote.register("parseDOM", { tag: "blockquote", parse: "block" }); - -var _loop = function _loop(i) { - _model.Heading.register("parseDOM", { - tag: "h" + i, - parse: function parse(dom, state) { - state.wrapIn(dom, this, { level: i }); - } - }); -}; - -for (var i = 1; i <= 6; i++) { - _loop(i); -}_model.HorizontalRule.register("parseDOM", { tag: "hr", parse: "block" }); - -_model.CodeBlock.register("parseDOM", { tag: "pre", parse: function parse(dom, state) { - var params = dom.firstChild && /^code$/i.test(dom.firstChild.nodeName) && dom.firstChild.getAttribute("class"); - if (params && /fence/.test(params)) { - var found = [], - re = /(?:^|\s)lang-(\S+)/g, - m = undefined; - while (m = re.test(params)) found.push(m[1]); - params = found.join(" "); - } else { - params = null; - } - var text = dom.textContent; - state.insertFrom(dom, this, { params: params }, text ? [state.schema.text(text)] : []); - } }); - -_model.BulletList.register("parseDOM", { tag: "ul", parse: "block" }); - -_model.OrderedList.register("parseDOM", { tag: "ol", parse: function parse(dom, state) { - var attrs = { order: dom.getAttribute("start") || 1 }; - state.wrapIn(dom, this, attrs); - } }); - -_model.ListItem.register("parseDOM", { tag: "li", parse: "block" }); - -_model.HardBreak.register("parseDOM", { tag: "br", parse: function parse(dom, state) { - state.insertFrom(dom, this); - } }); - -_model.Image.register("parseDOM", { tag: "img", parse: function parse(dom, state) { - state.insertFrom(dom, this, { - src: dom.getAttribute("src"), - title: dom.getAttribute("title") || null, - alt: dom.getAttribute("alt") || null - }); - } }); - -// Inline style tokens - -_model.LinkMark.register("parseDOM", { tag: "a", parse: function parse(dom, state) { - var href = dom.getAttribute("href"); - if (!href) return false; - state.wrapMark(dom, this.create({ href: href, title: dom.getAttribute("title") })); - } }); - -_model.EmMark.register("parseDOM", { tag: "i", parse: "mark" }); -_model.EmMark.register("parseDOM", { tag: "em", parse: "mark" }); - -_model.StrongMark.register("parseDOM", { tag: "b", parse: "mark" }); -_model.StrongMark.register("parseDOM", { tag: "strong", parse: "mark" }); - -_model.CodeMark.register("parseDOM", { tag: "code", parse: "mark" }); - -},{"../model":27,"./index":33}],33:[function(require,module,exports){ -// !! This module implements a way to register and access parsers from -// various input formats to ProseMirror's [document format](#Node). To -// load the actual parsers, you need to import parser modules like -// `parse/dom` or `parse/markdown`, which will then register -// themselves here, as well as export special-purpose parsing -// functions. -// -// These are the parses in the distribution: -// -// **`"json"`** -// : The top-level module defines a single parser `"json"`, which -// uses `Node.fromJSON` to parse JSON data. -// -// **`"dom"`** -// : Parses [DOM -// nodes](https://developer.mozilla.org/en-US/docs/Web/API/Node). -// Defined in `parse/dom`. See `fromDOM`. -// -// **`"html"`** -// : Parses strings of HTML content. Defined in `parse/dom`. -// -// **`"markdown"`** -// : Parses strings of -// [CommonMark](http://commonmark.org/)-formatted text. Defined in -// `parse/markdown`. See `fromMarkdown`. -// -// **`"text"`** -// : Simply splits a string of text on blank lines and creates a -// document containing those lines as paragraphs. Defined in -// `parse/text`. See `fromText`. - -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.parseFrom = parseFrom; -exports.knownSource = knownSource; -exports.defineSource = defineSource; -var parsers = Object.create(null); - -// :: (Schema, any, string, ?Object) → Node -// Parse document `value` from the format named by `format`. If -// `options` is given, it is passed along to the parser function. - -function parseFrom(schema, value, format, options) { - var converter = parsers[format]; - if (!converter) throw new Error("Source format " + format + " not defined"); - return converter(schema, value, options); -} - -// :: (string) → bool -// Query whether a parser for the named format has been registered. - -function knownSource(format) { - return !!parsers[format]; -} - -// :: (string, (Schema, any, ?Object) → Node) -// Register a parser function for `format`. - -function defineSource(format, func) { - parsers[format] = func; -} - -defineSource("json", function (schema, json) { - return schema.nodeFromJSON(json); -}); - -},{}],34:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.fromText = fromText; - -var _index = require("./index"); - -// FIXME is it meaningful to try and attach text-parsing information -// to node types? - -// :: (Schema, string) → Node -// Convert a string into a simple ProseMirror document. - -function fromText(schema, text) { - var blocks = text.trim().split(/\n{2,}/); - var nodes = []; - for (var i = 0; i < blocks.length; i++) { - var spans = []; - var parts = blocks[i].split("\n"); - for (var j = 0; j < parts.length; j++) { - if (j) spans.push(schema.node("hard_break")); - if (parts[j]) spans.push(schema.text(parts[j])); - } - nodes.push(schema.node("paragraph", null, spans)); - } - if (!nodes.length) nodes.push(schema.node("paragraph")); - return schema.node("doc", null, nodes); -} - -(0, _index.defineSource)("text", fromText); - -},{"./index":33}],35:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = (function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); - } - }return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; - }; -})(); - -exports.toDOM = toDOM; -exports.renderNodeToDOM = renderNodeToDOM; -exports.toHTML = toHTML; - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -var _model = require("../model"); - -var _index = require("./index"); - -// ;; #toc=false Object used to to expose relevant values and methods -// to DOM serializer functions. - -var DOMSerializer = (function () { - function DOMSerializer(options) { - _classCallCheck(this, DOMSerializer); - - // :: Object The options passed to the serializer. - this.options = options || {}; - // :: DOMDocument The DOM document in which we are working. - this.doc = this.options.document || window.document; - } - - // :: (Node, ?Object) → DOMFragment - // Serialize the content of the given node to a DOM fragment. When not - // in the browser, the `document` option, containing a DOM document, - // should be passed so that the serialize can create nodes. - // - // To define rendering behavior for your own [node](#NodeType) and - // [mark](#MarkType) types, give them a `serializeDOM` method. This - // method is passed a `Node` and a `DOMSerializer`, and should return - // the [DOM - // node](https://developer.mozilla.org/en-US/docs/Web/API/Node) that - // represents this node and its content. For marks, that should be an - // inline wrapping node like `` or ``. - // - // Individual attributes can also define serialization behavior. If an - // `Attribute` object has a `serializeDOM` method, that will be called - // with the DOM node representing the node that the attribute applies - // to and the atttribute's value, so that it can set additional DOM - // attributes on the DOM node. - - // :: (string, ?Object, ...union) → DOMNode - // Create a DOM node of the given type, with (optionally) the given - // attributes and content. Content elements may be strings (for text - // nodes) or other DOM nodes. - - _createClass(DOMSerializer, [{ - key: "elt", - value: function elt(type, attrs) { - var result = this.doc.createElement(type); - if (attrs) for (var _name in attrs) { - if (_name == "style") result.style.cssText = attrs[_name];else if (attrs[_name]) result.setAttribute(_name, attrs[_name]); - } - - for (var _len = arguments.length, content = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { - content[_key - 2] = arguments[_key]; - } - - for (var i = 0; i < content.length; i++) { - result.appendChild(typeof content[i] == "string" ? this.doc.createTextNode(content[i]) : content[i]); - }return result; - } - }, { - key: "renderNode", - value: function renderNode(node, offset) { - var dom = node.type.serializeDOM(node, this); - for (var attr in node.type.attrs) { - var desc = node.type.attrs[attr]; - if (desc.serializeDOM) desc.serializeDOM(dom, node.attrs[attr], this, node); - } - if (this.options.onRender) dom = this.options.onRender(node, dom, offset) || dom; - return dom; - } - }, { - key: "renderContent", - value: function renderContent(node, where) { - if (!where) where = this.doc.createDocumentFragment(); - if (!node.isTextblock) this.renderBlocksInto(node, where);else if (this.options.renderInlineFlat) this.renderInlineFlatInto(node, where);else this.renderInlineInto(node, where); - return where; - } - }, { - key: "renderBlocksInto", - value: function renderBlocksInto(parent, where) { - for (var i = parent.iter(), child = undefined; child = i.next().value;) { - if (this.options.path) this.options.path.push(i.offset - child.width); - where.appendChild(this.renderNode(child, i.offset - child.width)); - if (this.options.path) this.options.path.pop(); - } - } - }, { - key: "renderInlineInto", - value: function renderInlineInto(parent, where) { - var _this = this; - - var top = where; - var active = []; - parent.forEach(function (node, offset) { - var keep = 0; - for (; keep < Math.min(active.length, node.marks.length); ++keep) if (!node.marks[keep].eq(active[keep])) break; - while (keep < active.length) { - active.pop(); - top = top.parentNode; - } - while (active.length < node.marks.length) { - var add = node.marks[active.length]; - active.push(add); - top = top.appendChild(_this.renderMark(add)); - } - top.appendChild(_this.renderNode(node, offset)); - }); - } - }, { - key: "renderInlineFlatInto", - value: function renderInlineFlatInto(parent, where) { - var _this2 = this; - - parent.forEach(function (node, start) { - var dom = _this2.renderNode(node, start); - dom = _this2.wrapInlineFlat(dom, node.marks); - dom = _this2.options.renderInlineFlat(node, dom, start) || dom; - where.appendChild(dom); - }); - } - }, { - key: "renderMark", - value: function renderMark(mark) { - var dom = mark.type.serializeDOM(mark, this); - for (var attr in mark.type.attrs) { - var desc = mark.type.attrs[attr]; - if (desc.serializeDOM) desc.serializeDOM(dom, mark.attrs[attr], this); - } - return dom; - } - }, { - key: "wrapInlineFlat", - value: function wrapInlineFlat(dom, marks) { - for (var i = marks.length - 1; i >= 0; i--) { - var wrap = this.renderMark(marks[i]); - wrap.appendChild(dom); - dom = wrap; - } - return dom; - } - - // :: (Node, string, ?Object) → DOMNode - // Render the content of ProseMirror node into a DOM node with the - // given tag name and attributes. - }, { - key: "renderAs", - value: function renderAs(node, tagName, tagAttrs) { - return this.renderContent(node, this.elt(tagName, tagAttrs)); - } - }]); - - return DOMSerializer; -})(); - -function toDOM(node) { - var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - - return new DOMSerializer(options).renderContent(node); -} - -(0, _index.defineTarget)("dom", toDOM); - -// :: (Node, ?Object) → DOMNode -// Serialize a given node to a DOM node. This is useful when you need -// to serialize a part of a document, as opposed to the whole -// document. - -function renderNodeToDOM(node, options, offset) { - var serializer = new DOMSerializer(options); - var dom = serializer.renderNode(node, offset); - if (node.isInline) { - dom = serializer.wrapInlineFlat(dom, node.marks); - if (serializer.options.renderInlineFlat) dom = options.renderInlineFlat(node, dom, offset) || dom; - } - return dom; -} - -// :: (Node, ?Object) → string -// Serialize a node as an HTML string. Goes through `toDOM` and then -// serializes the result. Again, you must pass a `document` option -// when not in the browser. - -function toHTML(node, options) { - var serializer = new DOMSerializer(options); - var wrap = serializer.elt("div"); - wrap.appendChild(serializer.renderContent(node)); - return wrap.innerHTML; -} - -(0, _index.defineTarget)("html", toHTML); - -// Block nodes - -function def(cls, method) { - cls.prototype.serializeDOM = method; -} - -def(_model.BlockQuote, function (node, s) { - return s.renderAs(node, "blockquote"); -}); - -_model.BlockQuote.prototype.countCoordsAsChild = function (_, path, dom, coords) { - var childBox = dom.firstChild.getBoundingClientRect(); - if (coords.left < childBox.left - 2) return _model.Pos.from(path); -}; - -def(_model.BulletList, function (node, s) { - return s.renderAs(node, "ul"); -}); - -def(_model.OrderedList, function (node, s) { - return s.renderAs(node, "ol", { start: node.attrs.order != "1" && node.attrs.order }); -}); - -_model.OrderedList.prototype.countCoordsAsChild = _model.BulletList.prototype.countCoordsAsChild = function (_, path, dom, coords) { - for (var i = 0; i < dom.childNodes.length; i++) { - var child = dom.childNodes[i]; - if (!child.hasAttribute("pm-offset")) continue; - var childBox = child.getBoundingClientRect(); - if (coords.left > childBox.left - 2) return null; - if (childBox.top <= coords.top && childBox.bottom >= coords.top) return new _model.Pos(path, i); - } -}; - -def(_model.ListItem, function (node, s) { - return s.renderAs(node, "li"); -}); - -def(_model.HorizontalRule, function (_, s) { - return s.elt("hr"); -}); - -def(_model.Paragraph, function (node, s) { - return s.renderAs(node, "p"); -}); - -def(_model.Heading, function (node, s) { - return s.renderAs(node, "h" + node.attrs.level); -}); - -def(_model.CodeBlock, function (node, s) { - var code = s.renderAs(node, "code"); - if (node.attrs.params != null) code.className = "fence " + node.attrs.params.replace(/(^|\s+)/g, "$&lang-"); - return s.elt("pre", null, code); -}); - -// Inline content - -def(_model.Text, function (node, s) { - return s.doc.createTextNode(node.text); -}); - -def(_model.Image, function (node, s) { - return s.elt("img", { - src: node.attrs.src, - alt: node.attrs.alt, - title: node.attrs.title - }); -}); - -def(_model.HardBreak, function (_, s) { - return s.elt("br"); -}); - -// Inline styles - -def(_model.EmMark, function (_, s) { - return s.elt("em"); -}); - -def(_model.StrongMark, function (_, s) { - return s.elt("strong"); -}); - -def(_model.CodeMark, function (_, s) { - return s.elt("code"); -}); - -def(_model.LinkMark, function (mark, s) { - return s.elt("a", { href: mark.attrs.href, - title: mark.attrs.title }); -}); - -},{"../model":27,"./index":36}],36:[function(require,module,exports){ -// !! This module provides a way to register and access functions that -// serialize ProseMirror [documents](#Node) to various formats. To -// load the actual serializers, you need to include submodules of this -// module (or 3rd party serialization modules), which will register -// themselves to this module. -// -// These are the serializers defined: -// -// **`"json"`** -// : Use `Node.toJSON` to serialize the node as JSON. Defined by the -// top-level `serialize` module. -// -// **`"dom"`** -// : Serialize to a [DOM -// fragment](https://developer.mozilla.org/en-US/docs/Web/API/DocumentFragment). -// Defined in `serialize/dom`. See `toDOM`. -// -// **`"html"`** -// : Serialize to HTML text. Defined in `serialize/dom`. See `toHTML`. -// -// **`"markdown"`** -// : Serialize to [CommonMark](http://commonmark.org/) marked-up -// text. Defined in `serialize/markdown`. See `toMarkdown`. -// -// **`"text"`** -// : Serialize to plain text. Defined in `serialize/text`. See `toText`. - -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.serializeTo = serializeTo; -exports.knownTarget = knownTarget; -exports.defineTarget = defineTarget; -var serializers = Object.create(null); - -// :: (Node, string, ?Object) → any -// Serialize the given document to the given format. If `options` is -// given, it will be passed along to the serializer function. - -function serializeTo(doc, format, options) { - var converter = serializers[format]; - if (!converter) throw new Error("Target format " + format + " not defined"); - return converter(doc, options); -} - -// :: (string) → bool -// Query whether a given serialization format has been registered. - -function knownTarget(format) { - return !!serializers[format]; -} - -// :: (string, (Node, ?Object) → any) -// Register a function as the serializer for `format`. - -function defineTarget(format, func) { - serializers[format] = func; -} - -defineTarget("json", function (doc) { - return doc.toJSON(); -}); - -},{}],37:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.toText = toText; - -var _model = require("../model"); - -var _index = require("./index"); - -_model.Block.prototype.serializeText = function (node) { - var accum = ""; - node.forEach(function (child) { - return accum += child.type.serializeText(child); - }); - return accum; -}; - -_model.Textblock.prototype.serializeText = function (node) { - var text = _model.Block.prototype.serializeText(node); - return text && text + "\n\n"; -}; - -_model.Inline.prototype.serializeText = function () { - return ""; -}; - -_model.HardBreak.prototype.serializeText = function () { - return "\n"; -}; - -_model.Text.prototype.serializeText = function (node) { - return node.text; -}; - -// :: (Node) → string -// Serialize a node as a plain text string. - -function toText(doc) { - return doc.type.serializeText(doc).trim(); -} - -(0, _index.defineTarget)("text", toText); - -},{"../model":27,"./index":36}],38:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.canLift = canLift; -exports.canWrap = canWrap; - -var _model = require("../model"); - -var _transform = require("./transform"); - -var _step = require("./step"); - -var _tree = require("./tree"); - -var _map = require("./map"); - -// !! **`ancestor`** -// : Change the stack of nodes that wrap the part of the document -// between `from` and `to`, which must point into the same parent -// node. -// -// The set of ancestors to replace is determined by the `depth` -// property of the step's parameter. If this is greater than -// zero, `from` and `to` must point at the start and end of a -// stack of nodes, of that depth, since this step will not split -// nodes. -// -// The set of new ancestors to wrap with is determined by the -// `types` and `attrs` properties of the parameter. The first -// should be an array of `NodeType`s, and the second, optionally, -// an array of attribute objects. - -_step.Step.define("ancestor", { - apply: function apply(doc, step) { - var from = step.from, - to = step.to; - if (!(0, _tree.isFlatRange)(from, to)) return null; - var toParent = from.path, - start = from.offset, - end = to.offset; - var _step$param = step.param; - var _step$param$depth = _step$param.depth; - var depth = _step$param$depth === undefined ? 0 : _step$param$depth; - var _step$param$types = _step$param.types; - var types = _step$param$types === undefined ? [] : _step$param$types; - var _step$param$attrs = _step$param.attrs; - var attrs = _step$param$attrs === undefined ? [] : _step$param$attrs; - - var inner = doc.path(from.path); - for (var i = 0; i < depth; i++) { - if (start > 0 || end < doc.path(toParent).size || toParent.length == 0) return null; - start = toParent[toParent.length - 1]; - end = start + 1; - toParent = toParent.slice(0, toParent.length - 1); - } - if (depth == 0 && types.length == 0) return null; - - var parent = doc.path(toParent), - parentSize = parent.size, - newParent = undefined; - if (parent.type.locked) return null; - if (types.length) { - var _ret = (function () { - var lastWrapper = types[types.length - 1]; - var content = inner.content.slice(from.offset, to.offset); - if (!parent.type.canContainType(types[0]) || content.some(function (n) { - return !lastWrapper.canContain(n); - }) || !inner.size && !lastWrapper.canBeEmpty || lastWrapper.locked) return { - v: null - }; - var node = null; - for (var i = types.length - 1; i >= 0; i--) { - node = types[i].create(attrs[i], node || content); - }newParent = parent.splice(start, end, _model.Fragment.from(node)); - })(); - - if (typeof _ret === "object") return _ret.v; - } else { - if (!parent.type.canContainFragment(inner.content) || !inner.size && start == 0 && end == parent.size && !parent.type.canBeEmpty) return null; - newParent = parent.splice(start, end, inner.content); - } - var copy = doc.replaceDeep(toParent, newParent); - - var toInner = toParent.slice(); - for (var i = 0; i < types.length; i++) { - toInner.push(i ? 0 : start); - }var startOfInner = new _model.Pos(toInner, types.length ? 0 : start); - var replaced = null; - var insertedSize = types.length ? 1 : to.offset - from.offset; - if (depth != types.length || depth > 1 || types.length > 1) { - var posBefore = new _model.Pos(toParent, start); - var posAfter1 = new _model.Pos(toParent, end), - posAfter2 = new _model.Pos(toParent, start + insertedSize); - var endOfInner = new _model.Pos(toInner, startOfInner.offset + (to.offset - from.offset)); - replaced = [new _map.ReplacedRange(posBefore, from, posBefore, startOfInner), new _map.ReplacedRange(to, posAfter1, endOfInner, posAfter2, posAfter1, posAfter2)]; - } - var moved = [new _map.MovedRange(from, to.offset - from.offset, startOfInner)]; - if (end - start != insertedSize) moved.push(new _map.MovedRange(new _model.Pos(toParent, end), parentSize - end, new _model.Pos(toParent, start + insertedSize))); - return new _step.StepResult(copy, new _map.PosMap(moved, replaced)); - }, - invert: function invert(step, oldDoc, map) { - var types = [], - attrs = []; - if (step.param.depth) for (var i = 0; i < step.param.depth; i++) { - var _parent = oldDoc.path(step.from.path.slice(0, step.from.path.length - i)); - types.unshift(_parent.type); - attrs.unshift(_parent.attrs); - } - var newFrom = map.map(step.from).pos; - var newTo = step.from.cmp(step.to) ? map.map(step.to, -1).pos : newFrom; - return new _step.Step("ancestor", newFrom, newTo, null, { depth: step.param.types ? step.param.types.length : 0, - types: types, attrs: attrs }); - }, - paramToJSON: function paramToJSON(param) { - return { depth: param.depth, - types: param.types && param.types.map(function (t) { - return t.name; - }), - attrs: param.attrs }; - }, - paramFromJSON: function paramFromJSON(schema, json) { - return { depth: json.depth, - types: json.types && json.types.map(function (n) { - return schema.nodeType(n); - }), - attrs: json.attrs }; - } -}); - -function canBeLifted(doc, range) { - var content = [doc.path(range.from.path)], - unwrap = false; - for (;;) { - var parentDepth = -1; - - var _loop = function _loop(_node, i) { - if (!content.some(function (inner) { - return !_node.type.canContainContent(inner.type); - })) parentDepth = i; - _node = _node.child(range.from.path[i]); - node = _node; - }; - - for (var node = doc, i = 0; i < range.from.path.length; i++) { - _loop(node, i); - } - if (parentDepth > -1) return { path: range.from.path.slice(0, parentDepth), unwrap: unwrap }; - if (unwrap || !content[0].isBlock) return null; - content = content[0].content.slice(range.from.offset, range.to.offset); - unwrap = true; - } -} - -// :: (Node, Pos, ?Pos) → bool -// Tells you whether the given positions' [sibling -// range](#Node.siblingRange), or any of its ancestor nodes, can be -// lifted out of a parent. - -function canLift(doc, from, to) { - var range = doc.siblingRange(from, to || from); - var found = canBeLifted(doc, range); - if (found) return { found: found, range: range }; -} - -// :: (Pos, ?Pos) → Transform -// Lift the nearest liftable ancestor of the [sibling -// range](#Node.siblingRange) of the given positions out of its -// parent (or do nothing if no such node exists). -_transform.Transform.prototype.lift = function (from) { - var to = arguments.length <= 1 || arguments[1] === undefined ? from : arguments[1]; - return (function () { - var can = canLift(this.doc, from, to); - if (!can) return this; - var found = can.found; - var range = can.range; - - var depth = range.from.path.length - found.path.length; - var rangeNode = found.unwrap && this.doc.path(range.from.path); - - for (var d = 0, pos = range.to;; d++) { - if (pos.offset < this.doc.path(pos.path).size) { - this.split(pos, depth - d); - break; - } - if (d == depth - 1) break; - pos = pos.shorten(null, 1); - } - for (var d = 0, pos = range.from;; d++) { - if (pos.offset > 0) { - this.split(pos, depth - d); - var cut = range.from.path.length - depth, - path = pos.path.slice(0, cut).concat(pos.path[cut] + 1); - while (path.length < range.from.path.length) path.push(0); - range = { from: new _model.Pos(path, 0), to: new _model.Pos(path, range.to.offset - range.from.offset) }; - break; - } - if (d == depth - 1) break; - pos = pos.shorten(); - } - if (found.unwrap) { - for (var i = range.to.offset - 1; i > range.from.offset; i--) { - this.join(new _model.Pos(range.from.path, i)); - }var size = 0; - for (var i = rangeNode.iter(range.from.offset, range.to.offset), child = undefined; child = i.next().value;) { - size += child.size; - }var path = range.from.path.concat(range.from.offset); - range = { from: new _model.Pos(path, 0), to: new _model.Pos(path, size) }; - ++depth; - } - this.step("ancestor", range.from, range.to, null, { depth: depth }); - return this; - }).apply(this, arguments); -}; - -// :: (Node, Pos, ?Pos, NodeType) → bool -// Determines whether the [sibling range](#Node.siblingRange) of the -// given positions can be wrapped in the given node type. - -function canWrap(doc, from, to, type) { - var range = doc.siblingRange(from, to || from); - if (range.from.offset == range.to.offset) return null; - var parent = doc.path(range.from.path); - var around = parent.type.findConnection(type); - var inside = type.findConnection(parent.child(range.from.offset).type); - if (around && inside) return { range: range, around: around, inside: inside }; -} - -// :: (Pos, ?Pos, NodeType, ?Object) → Transform -// Wrap the [sibling range](#Node.siblingRange) of the given positions -// in a node of the given type, with the given attributes (if -// possible). -_transform.Transform.prototype.wrap = function (from, to, type, wrapAttrs) { - var can = canWrap(this.doc, from, to, type); - if (!can) return this; - var range = can.range; - var around = can.around; - var inside = can.inside; - - var types = around.concat(type).concat(inside); - var attrs = around.map(function () { - return null; - }).concat(wrapAttrs).concat(inside.map(function () { - return null; - })); - this.step("ancestor", range.from, range.to, null, { types: types, attrs: attrs }); - if (inside.length) { - var toInner = range.from.path.slice(); - for (var i = 0; i < around.length + inside.length + 1; i++) { - toInner.push(i ? 0 : range.from.offset); - }for (var i = range.to.offset - 1 - range.from.offset; i > 0; i--) { - this.split(new _model.Pos(toInner, i), inside.length); - } - } - return this; -}; - -// :: (Pos, ?Pos, NodeType, ?Object) → Transform -// Set the type of all textblocks (partly) between `from` and `to` to -// the given node type with the given attributes. -_transform.Transform.prototype.setBlockType = function (from, to, type, attrs) { - var _this = this; - - this.doc.nodesBetween(from, to || from, function (node, path) { - if (node.isTextblock && !node.hasMarkup(type, attrs)) { - path = path.slice(); - // Ensure all markup that isn't allowed in the new node type is cleared - _this.clearMarkup(new _model.Pos(path, 0), new _model.Pos(path, node.size), type); - _this.step("ancestor", new _model.Pos(path, 0), new _model.Pos(path, _this.doc.path(path).size), null, { depth: 1, types: [type], attrs: [attrs] }); - return false; - } - }); - return this; -}; - -// :: (Pos, NodeType, ?Object) → Transform -// Change the type and attributes of the node after `pos`. -_transform.Transform.prototype.setNodeType = function (pos, type, attrs) { - var node = this.doc.nodeAfter(pos); - var path = pos.toPath(); - this.step("ancestor", new _model.Pos(path, 0), new _model.Pos(path, node.size), null, { depth: 1, types: [type], attrs: [attrs] }); - return this; -}; - -},{"../model":27,"./map":41,"./step":45,"./transform":46,"./tree":47}],39:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -require("./mark"); - -require("./split"); - -require("./replace"); - -// !! This module defines a way to transform documents. Transforming -// happens in `Step`s, which are atomic, well-defined modifications to -// a document. [Applying](`Step.apply`) a step produces a new document -// and a [position map](#PosMap) that maps positions in the old -// document to position in the new document. Steps can be -// [inverted](#Step.invert) to create a step that undoes their effect, -// and chained together in a convenience object called a `Transform`. -// -// This module does not depend on the browser API being available -// (i.e. you can load it into any JavaScript environment). -// -// These are the types of steps defined: -var _transform = require("./transform"); - -Object.defineProperty(exports, "Transform", { - enumerable: true, - get: function get() { - return _transform.Transform; - } -}); - -var _step = require("./step"); - -Object.defineProperty(exports, "Step", { - enumerable: true, - get: function get() { - return _step.Step; - } -}); -Object.defineProperty(exports, "StepResult", { - enumerable: true, - get: function get() { - return _step.StepResult; - } -}); - -var _ancestor = require("./ancestor"); - -Object.defineProperty(exports, "canLift", { - enumerable: true, - get: function get() { - return _ancestor.canLift; - } -}); -Object.defineProperty(exports, "canWrap", { - enumerable: true, - get: function get() { - return _ancestor.canWrap; - } -}); - -var _join = require("./join"); - -Object.defineProperty(exports, "joinPoint", { - enumerable: true, - get: function get() { - return _join.joinPoint; - } -}); -Object.defineProperty(exports, "joinableBlocks", { - enumerable: true, - get: function get() { - return _join.joinableBlocks; - } -}); - -var _map = require("./map"); - -Object.defineProperty(exports, "PosMap", { - enumerable: true, - get: function get() { - return _map.PosMap; - } -}); -Object.defineProperty(exports, "MapResult", { - enumerable: true, - get: function get() { - return _map.MapResult; - } -}); -Object.defineProperty(exports, "Remapping", { - enumerable: true, - get: function get() { - return _map.Remapping; - } -}); - -},{"./ancestor":38,"./join":40,"./map":41,"./mark":42,"./replace":43,"./split":44,"./step":45,"./transform":46}],40:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.joinableBlocks = joinableBlocks; -exports.joinPoint = joinPoint; - -var _model = require("../model"); - -var _transform = require("./transform"); - -var _step = require("./step"); - -var _map = require("./map"); - -// !! **`join`** -// : Join two block elements together. `from` and `to` must point at -// the end of the first and start of the second element (so that -// the intention is preserved even when the positions are mapped). - -_step.Step.define("join", { - apply: function apply(doc, step) { - var before = doc.path(step.from.path); - var after = doc.path(step.to.path); - if (step.from.offset < before.size || step.to.offset > 0 || !before.type.canContainFragment(after.content)) return null; - var pFrom = step.from.path, - pTo = step.to.path; - var last = pFrom.length - 1, - offset = pFrom[last] + 1; - if (pFrom.length != pTo.length || pFrom.length == 0 || offset != pTo[last]) return null; - for (var i = 0; i < last; i++) { - if (pFrom[i] != pTo[i]) return null; - }var targetPath = pFrom.slice(0, last); - var target = doc.path(targetPath), - oldSize = target.size; - if (target.type.locked) return null; - var joined = before.append(after.content); - var copy = doc.replaceDeep(targetPath, target.splice(offset - 1, offset + 1, _model.Fragment.from(joined))); - - var map = new _map.PosMap([new _map.MovedRange(step.to, after.size, step.from), new _map.MovedRange(new _model.Pos(targetPath, offset + 1), oldSize - offset - 1, new _model.Pos(targetPath, offset))], [new _map.ReplacedRange(step.from, step.to, step.from, step.from, step.to.shorten())]); - return new _step.StepResult(copy, map); - }, - invert: function invert(step, oldDoc) { - return new _step.Step("split", null, null, step.from, oldDoc.path(step.to.path).copy()); - } -}); - -// :: (Node, Pos) → bool -// Test whether the blocks before and after a given position can be -// joined. - -function joinableBlocks(doc, pos) { - if (pos.offset == 0) return false; - var parent = doc.path(pos.path); - if (parent.isTextblock || pos.offset == parent.size) return false; - var type = parent.child(pos.offset - 1).type; - return !type.isTextblock && type.contains && type == parent.child(pos.offset).type; -} - -// :: (Node, Pos, ?number) → ?Pos -// Find an ancestor of the given position that can be joined to the -// block before (or after if `dir` is positive). Returns the joinable -// point, if any. - -function joinPoint(doc, pos) { - var dir = arguments.length <= 2 || arguments[2] === undefined ? -1 : arguments[2]; - - for (;;) { - if (joinableBlocks(doc, pos)) return pos; - if (pos.depth == 0) return null; - pos = pos.shorten(null, dir < 0 ? 0 : 1); - } -} - -// :: (Pos) → Transform -// Join the blocks around the given position. -_transform.Transform.prototype.join = function (at) { - var parent = this.doc.path(at.path); - if (at.offset == 0 || at.offset == parent.size || parent.isTextblock) return this; - this.step("join", new _model.Pos(at.path.concat(at.offset - 1), parent.child(at.offset - 1).size), new _model.Pos(at.path.concat(at.offset), 0)); - return this; -}; - -},{"../model":27,"./map":41,"./step":45,"./transform":46}],41:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = (function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); - } - }return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; - }; -})(); - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -var _model = require("../model"); - -// ;; #kind=interface #path=Mappable #toc=false -// There are various things that positions can be mapped through. -// We'll denote those as 'mappable'. This is not an actual class in -// the codebase, only an agreed-on interface. - -// :: (pos: Pos, bias: ?number) → MapResult -// #path=Mappable.map -// Map a position through this object. When given, the `bias` -// determines in which direction to move when a chunk of content is -// inserted at or around the mapped position. - -var MovedRange = (function () { - function MovedRange(start, size) { - var dest = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2]; - - _classCallCheck(this, MovedRange); - - this.start = start; - this.size = size; - this.dest = dest; - } - - _createClass(MovedRange, [{ - key: "toString", - value: function toString() { - return "[moved " + this.start + "+" + this.size + " to " + this.dest + "]"; - } - }, { - key: "end", - get: function get() { - return new _model.Pos(this.start.path, this.start.offset + this.size); - } - }]); - - return MovedRange; -})(); - -exports.MovedRange = MovedRange; - -var Side = function Side(from, to, ref) { - _classCallCheck(this, Side); - - this.from = from; - this.to = to; - this.ref = ref; -}; - -var ReplacedRange = (function () { - function ReplacedRange(from, to, newFrom, newTo) { - var ref = arguments.length <= 4 || arguments[4] === undefined ? from : arguments[4]; - var newRef = arguments.length <= 5 || arguments[5] === undefined ? newFrom : arguments[5]; - return (function () { - _classCallCheck(this, ReplacedRange); - - this.before = new Side(from, to, ref); - this.after = new Side(newFrom, newTo, newRef); - }).apply(this, arguments); - } - - _createClass(ReplacedRange, [{ - key: "toString", - value: function toString() { - return "[replaced " + this.before.from + "-" + this.before.to + " with " + this.after.from + "-" + this.after.to + "]"; - } - }]); - - return ReplacedRange; -})(); - -exports.ReplacedRange = ReplacedRange; - -var empty = []; - -function offsetFrom(base, pos) { - if (pos.path.length > base.path.length) { - var path = [pos.path[base.path.length] - base.offset]; - for (var i = base.path.length + 1; i < pos.path.length; i++) { - path.push(pos.path[i]); - }return new _model.Pos(path, pos.offset); - } else { - return new _model.Pos([], pos.offset - base.offset); - } -} - -function mapThrough(map, pos, bias, back) { - if (bias === undefined) bias = 1; - - for (var i = 0; i < map.replaced.length; i++) { - var range = map.replaced[i], - side = back ? range.after : range.before; - var left = undefined, - right = undefined; - if ((left = pos.cmp(side.from)) >= 0 && (right = pos.cmp(side.to)) <= 0) { - var other = back ? range.before : range.after; - return new MapResult(bias < 0 ? other.from : other.to, !!(left && right), { rangeID: i, offset: offsetFrom(side.ref, pos) }); - } - } - - for (var i = 0; i < map.moved.length; i++) { - var range = map.moved[i]; - var start = back ? range.dest : range.start; - if (pos.cmp(start) >= 0 && _model.Pos.cmp(pos.path, pos.offset, start.path, start.offset + range.size) <= 0) { - var dest = back ? range.start : range.dest; - var depth = start.depth; - if (pos.depth > depth) { - var offset = dest.offset + (pos.path[depth] - start.offset); - return new MapResult(new _model.Pos(dest.path.concat(offset).concat(pos.path.slice(depth + 1)), pos.offset)); - } else { - return new MapResult(new _model.Pos(dest.path, dest.offset + (pos.offset - start.offset))); - } - } - } - - return new MapResult(pos); -} - -// ;; A position map, holding information about the way positions in -// the pre-step version of a document correspond to positions in the -// post-step version. This class implements `Mappable`. - -var PosMap = (function () { - function PosMap(moved, replaced) { - _classCallCheck(this, PosMap); - - this.moved = moved || empty; - this.replaced = replaced || empty; - } - - // ;; #toc=false The return value of mapping a position. - - _createClass(PosMap, [{ - key: "recover", - value: function recover(offset) { - return this.replaced[offset.rangeID].after.ref.extend(offset.offset); - } - - // :: (Pos, ?number) → MapResult - // Map the given position through this map. The `bias` parameter can - // be used to control what happens when the transform inserted - // content at (or around) this position—if `bias` is negative, the a - // position before the inserted content will be returned, if it is - // positive, a position after the insertion is returned. - }, { - key: "map", - value: function map(pos, bias) { - return mapThrough(this, pos, bias, false); - } - - // :: () → PosMap - // Create an inverted version of this map. The result can be used to - // map positions in the post-step document to the pre-step document. - }, { - key: "invert", - value: function invert() { - return new InvertedPosMap(this); - } - }, { - key: "toString", - value: function toString() { - return this.moved.concat(this.replaced).join(" "); - } - }]); - - return PosMap; -})(); - -exports.PosMap = PosMap; - -var MapResult = function MapResult(pos) { - var deleted = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1]; - var recover = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2]; - - _classCallCheck(this, MapResult); - - // :: Pos The mapped version of the position. - this.pos = pos; - // :: bool Tells you whether the position was deleted, that is, - // whether the step removed its surroundings from the document. - this.deleted = deleted; - this.recover = recover; -}; - -exports.MapResult = MapResult; - -var InvertedPosMap = (function () { - function InvertedPosMap(map) { - _classCallCheck(this, InvertedPosMap); - - this.inner = map; - } - - _createClass(InvertedPosMap, [{ - key: "recover", - value: function recover(offset) { - return this.inner.replaced[offset.rangeID].before.ref.extend(offset.offset); - } - }, { - key: "map", - value: function map(pos, bias) { - return mapThrough(this.inner, pos, bias, true); - } - }, { - key: "invert", - value: function invert() { - return this.inner; - } - }, { - key: "toString", - value: function toString() { - return "-" + this.inner; - } - }]); - - return InvertedPosMap; -})(); - -var nullMap = new PosMap(); - -exports.nullMap = nullMap; -// ;; A remapping represents a pipeline of zero or more mappings. It -// is a specialized data structured used to manage mapping through a -// series of steps, typically including inverted and non-inverted -// versions of the same step. (This comes up when ‘rebasing’ steps for -// collaboration or history management.) This class implements -// `Mappable`. - -var Remapping = (function () { - // :: (?[PosMap], ?[PosMap]) - - function Remapping() { - var head = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0]; - var tail = arguments.length <= 1 || arguments[1] === undefined ? [] : arguments[1]; - var mirror = arguments.length <= 2 || arguments[2] === undefined ? Object.create(null) : arguments[2]; - - _classCallCheck(this, Remapping); - - // :: [PosMap] - // The maps in the head of the mapping are applied to input - // positions first, back-to-front. So the map at the end of this - // array (if any) is the very first one applied. - this.head = head; - // The maps in the tail are applied last, front-to-back. - this.tail = tail; - this.mirror = mirror; - } - - // :: (PosMap, ?number) → number - // Add a map to the mapping's front. If this map is the mirror image - // (produced by an inverted step) of another map in this mapping, - // that map's id (as returned by this method or - // [`addToBack`](#Remapping.addToBack)) should be passed as a second - // parameter to register the correspondence. - - _createClass(Remapping, [{ - key: "addToFront", - value: function addToFront(map, corr) { - this.head.push(map); - var id = -this.head.length; - if (corr != null) this.mirror[id] = corr; - return id; - } - - // :: (PosMap, ?number) → number - // Add a map to the mapping's back. If the map is the mirror image - // of another mapping in this object, the id of that map should be - // passed to register the correspondence. - }, { - key: "addToBack", - value: function addToBack(map, corr) { - this.tail.push(map); - var id = this.tail.length - 1; - if (corr != null) this.mirror[corr] = id; - return id; - } - }, { - key: "get", - value: function get(id) { - return id < 0 ? this.head[-id - 1] : this.tail[id]; - } - - // :: (Pos, ?number) → MapResult - // Map a position through this remapping, optionally passing a bias - // direction. - }, { - key: "map", - value: function map(pos, bias) { - var deleted = false; - - for (var i = -this.head.length; i < this.tail.length; i++) { - var map = this.get(i); - var result = map.map(pos, bias); - if (result.recover) { - var corr = this.mirror[i]; - if (corr != null) { - i = corr; - pos = this.get(corr).recover(result.recover); - continue; - } - } - if (result.deleted) deleted = true; - pos = result.pos; - } - - return new MapResult(pos, deleted); - } - }]); - - return Remapping; -})(); - -exports.Remapping = Remapping; - -},{"../model":27}],42:[function(require,module,exports){ -"use strict"; - -var _model = require("../model"); - -var _transform = require("./transform"); - -var _step = require("./step"); - -var _tree = require("./tree"); - -// !! -// **`addMark`** -// : Add the `Mark` given as the step's parameter to all -// inline content between `from` and `to` (when allowed). -// -// **`removeMark`** -// : Remove the `Mark` given as the step's parameter from all inline -// content between `from` and `to`. - -_step.Step.define("addMark", { - apply: function apply(doc, step) { - return new _step.StepResult((0, _tree.copyStructure)(doc, step.from, step.to, function (node, from, to) { - if (!node.type.canContainMark(step.param)) return node; - return (0, _tree.copyInline)(node, from, to, function (node) { - return node.mark(step.param.addToSet(node.marks)); - }); - })); - }, - invert: function invert(step, _oldDoc, map) { - return new _step.Step("removeMark", step.from, map.map(step.to).pos, null, step.param); - }, - paramToJSON: function paramToJSON(param) { - return param.toJSON(); - }, - paramFromJSON: function paramFromJSON(schema, json) { - return schema.markFromJSON(json); - } -}); - -// :: (Pos, Pos, Mark) → Transform -// Add the given mark to the inline content between `from` and `to`. -_transform.Transform.prototype.addMark = function (from, to, mark) { - var _this = this; - - var removed = [], - added = [], - removing = null, - adding = null; - this.doc.inlineNodesBetween(from, to, function (_ref, path, start, end, parent) { - var marks = _ref.marks; - - if (mark.isInSet(marks) || !parent.type.canContainMark(mark.type)) { - adding = removing = null; - } else { - var rm = mark.type.isInSet(marks); - if (rm) { - if (removing && removing.param.eq(rm)) { - removing.to = new _model.Pos(path, end); - } else { - removing = new _step.Step("removeMark", new _model.Pos(path, start), new _model.Pos(path, end), null, rm); - removed.push(removing); - } - } else if (removing) { - removing = null; - } - if (adding) { - adding.to = new _model.Pos(path, end); - } else { - adding = new _step.Step("addMark", new _model.Pos(path, start), new _model.Pos(path, end), null, mark); - added.push(adding); - } - } - }); - removed.forEach(function (s) { - return _this.step(s); - }); - added.forEach(function (s) { - return _this.step(s); - }); - return this; -}; - -_step.Step.define("removeMark", { - apply: function apply(doc, step) { - return new _step.StepResult((0, _tree.copyStructure)(doc, step.from, step.to, function (node, from, to) { - return (0, _tree.copyInline)(node, from, to, function (node) { - return node.mark(step.param.removeFromSet(node.marks)); - }); - })); - }, - invert: function invert(step, _oldDoc, map) { - return new _step.Step("addMark", step.from, map.map(step.to).pos, null, step.param); - }, - paramToJSON: function paramToJSON(param) { - return param.toJSON(); - }, - paramFromJSON: function paramFromJSON(schema, json) { - return schema.markFromJSON(json); - } -}); - -// :: (Pos, Pos, union) → Transform -// Remove the given mark, or all marks of the given type, from inline -// nodes between `from` and `to`. -_transform.Transform.prototype.removeMark = function (from, to) { - var _this2 = this; - - var mark = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2]; - - var matched = [], - step = 0; - this.doc.inlineNodesBetween(from, to, function (_ref2, path, start, end) { - var marks = _ref2.marks; - - step++; - var toRemove = null; - if (mark instanceof _model.MarkType) { - var found = mark.isInSet(marks); - if (found) toRemove = [found]; - } else if (mark) { - if (mark.isInSet(marks)) toRemove = [mark]; - } else { - toRemove = marks; - } - if (toRemove && toRemove.length) { - path = path.slice(); - for (var i = 0; i < toRemove.length; i++) { - var rm = toRemove[i], - found = undefined; - for (var j = 0; j < matched.length; j++) { - var m = matched[j]; - if (m.step == step - 1 && rm.eq(matched[j].style)) found = m; - } - if (found) { - found.to = new _model.Pos(path, end); - found.step = step; - } else { - matched.push({ style: rm, from: new _model.Pos(path, start), to: new _model.Pos(path, end), step: step }); - } - } - } - }); - matched.forEach(function (m) { - return _this2.step("removeMark", m.from, m.to, null, m.style); - }); - return this; -}; - -// :: (Pos, Pos, ?NodeType) → Transform -// Remove all marks and non-text inline nodes, or if `newParent` is -// given, all marks and inline nodes that may not appear as content of -// `newParent`, from the given range. -_transform.Transform.prototype.clearMarkup = function (from, to, newParent) { - var _this3 = this; - - var delSteps = []; // Must be accumulated and applied in inverse order - this.doc.inlineNodesBetween(from, to, function (_ref3, path, start, end) { - var marks = _ref3.marks; - var type = _ref3.type; - - if (newParent ? !newParent.canContainType(type) : !type.isText) { - path = path.slice(); - var _from = new _model.Pos(path, start); - delSteps.push(new _step.Step("replace", _from, new _model.Pos(path, end), _from)); - return; - } - for (var i = 0; i < marks.length; i++) { - var mark = marks[i]; - if (!newParent || !newParent.canContainMark(mark.type)) { - path = path.slice(); - _this3.step("removeMark", new _model.Pos(path, start), new _model.Pos(path, end), null, mark); - } - } - }); - for (var i = delSteps.length - 1; i >= 0; i--) { - this.step(delSteps[i]); - }return this; -}; - -},{"../model":27,"./step":45,"./transform":46,"./tree":47}],43:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.replace = replace; - -var _model = require("../model"); - -var _transform = require("./transform"); - -var _step = require("./step"); - -var _map = require("./map"); - -var _tree = require("./tree"); - -// !! **`replace`** - -// : Delete the part of the document between `from` and `to` and -// optionally replace it with another chunk of content. `pos` must -// point at the ‘root’ at which the cut starts—a position between -// and above `from` and `to`. -// -// When new content is to be inserted, the step's parameter should -// be an object of shape `{content: `[`Fragment`](#Fragment)`, -// openLeft: number, openRight: number}`. The step will insert the -// given content at the root of the cut, and `openLeft` and -// `openRight` indicate how much of the content on both sides -// should be consided ‘open’. -// -// A replace step will try to join open nodes on both sides of the -// cut. That is, nodes in the original document that are partially -// cut off by `from` and `to`, and nodes at the sides of the -// replacement content as specificed by `openLeft` and -// `openRight`. For example, if `openLeft` is 2, the first node of -// the replacement content as well as its first child is -// considered open. Whenever two open nodes with the same -// [markup](#Node.sameMarkup) end up next to each other, they are -// joined. Open nodes that aren't joined are [closed](#Node.close) -// to ensure their content (or lack of it) is valid. - -function findMovedChunks(oldNode, oldPath, newNode, startDepth) { - var moved = []; - var newPath = oldPath.path.slice(0, startDepth); - - for (var depth = startDepth;; depth++) { - var joined = depth == oldPath.depth ? 0 : 1; - var cut = depth == oldPath.depth ? oldPath.offset : oldPath.path[depth]; - var afterCut = oldNode.size - cut; - var newOffset = newNode.size - afterCut; - - var from = oldPath.shorten(depth, joined); - var to = new _model.Pos(newPath, newOffset + joined); - if (from.cmp(to)) moved.push(new _map.MovedRange(from, afterCut - joined, to)); - - if (!joined) return moved; - - oldNode = oldNode.child(cut); - newNode = newNode.child(newOffset); - newPath = newPath.concat(newOffset); - } -} - -function replace(node, from, to, root, repl) { - var depth = arguments.length <= 5 || arguments[5] === undefined ? 0 : arguments[5]; - - if (depth == root.length) { - var before = node.sliceBetween(null, from, depth); - var after = node.sliceBetween(to, null, depth), - result = undefined; - if (!before.type.canContainFragment(repl.content)) return null; - if (repl.content.size) result = before.append(repl.content, from.depth - depth, repl.openLeft).append(after.content, repl.openRight, to.depth - depth);else result = before.append(after.content, from.depth - depth, to.depth - depth); - if (!result.size && !result.type.canBeEmpty) result = result.copy(result.type.defaultContent()); - return { doc: result, moved: findMovedChunks(node, to, result, depth) }; - } else { - var pos = root[depth]; - var result = replace(node.child(pos), from, to, root, repl, depth + 1); - if (!result) return null; - return { doc: node.replace(pos, result.doc), moved: result.moved }; - } -} - -var nullRepl = { content: _model.emptyFragment, openLeft: 0, openRight: 0 }; - -_step.Step.define("replace", { - apply: function apply(doc, step) { - var rootPos = step.pos, - root = rootPos.path; - if (step.from.depth < root.length || step.to.depth < root.length) return null; - for (var i = 0; i < root.length; i++) { - if (step.from.path[i] != root[i] || step.to.path[i] != root[i]) return null; - }var result = replace(doc, step.from, step.to, rootPos.path, step.param || nullRepl); - if (!result) return null; - var out = result.doc; - var moved = result.moved; - - var end = moved.length ? moved[moved.length - 1].dest : step.to; - var replaced = new _map.ReplacedRange(step.from, step.to, step.from, end, rootPos, rootPos); - return new _step.StepResult(out, new _map.PosMap(moved, [replaced])); - }, - invert: function invert(step, oldDoc, map) { - var depth = step.pos.depth; - return new _step.Step("replace", step.from, map.map(step.to).pos, step.from.shorten(depth), { - content: oldDoc.path(step.pos.path).content.sliceBetween(step.from, step.to, depth), - openLeft: step.from.depth - depth, - openRight: step.to.depth - depth - }); - }, - paramToJSON: function paramToJSON(param) { - return param && { content: param.content.size && param.content.toJSON(), - openLeft: param.openLeft, openRight: param.openRight }; - }, - paramFromJSON: function paramFromJSON(schema, json) { - return json && { content: _model.Fragment.fromJSON(schema, json.content), - openLeft: json.openLeft, openRight: json.openRight }; - } -}); - -function shiftFromStack(stack, depth) { - var shifted = stack[depth] = stack[depth].splice(0, 1, _model.emptyFragment); - for (var i = depth - 1; i >= 0; i--) { - shifted = stack[i] = stack[i].replace(0, shifted); - } -} - -// FIXME find a not so horribly confusing way to express this -function buildInserted(nodesLeft, source, start, end) { - var sliced = source.sliceBetween(start, end); - var nodesRight = []; - for (var node = sliced, i = 0; i <= start.path.length; i++, node = node.firstChild) { - nodesRight.push(node); - }var same = (0, _tree.samePathDepth)(start, end); - var searchLeft = nodesLeft.length - 1, - searchRight = nodesRight.length - 1; - var result = null; - - var inner = nodesRight[searchRight]; - if (inner.isTextblock && inner.size && nodesLeft[searchLeft].isTextblock) { - result = nodesLeft[searchLeft--].copy(inner.content); - --searchRight; - shiftFromStack(nodesRight, searchRight); - } - - for (;;) { - var node = nodesRight[searchRight], - type = node.type, - matched = null; - var outside = searchRight <= same; - for (var i = searchLeft; i >= 0; i--) { - var left = nodesLeft[i]; - if (outside ? left.type.canContainContent(node.type) : left.type == type) { - matched = i; - break; - } - } - if (matched != null) { - if (!result) { - result = nodesLeft[matched].copy(node.content); - searchLeft = matched - 1; - } else { - while (searchLeft >= matched) { - var wrap = nodesLeft[searchLeft]; - var content = _model.Fragment.from(result); - result = wrap.copy(searchLeft == matched ? content.append(node.content) : content); - searchLeft--; - } - } - } - if (matched != null || node.size == 0) { - if (outside) break; - if (searchRight) shiftFromStack(nodesRight, searchRight - 1); - } - searchRight--; - } - - var repl = { content: result ? result.content : _model.emptyFragment, - openLeft: start.depth - searchRight, - openRight: end.depth - searchRight }; - return { repl: repl, depth: searchLeft + 1 }; -} - -function moveText(tr, doc, before, after) { - var root = (0, _tree.samePathDepth)(before, after); - var cutAt = after.shorten(null, 1); - while (cutAt.path.length > root && doc.path(cutAt.path).size == 1) cutAt = cutAt.shorten(null, 1); - tr.split(cutAt, cutAt.path.length - root); - var start = after, - end = new _model.Pos(start.path, doc.path(start.path).size); - var parent = doc.path(start.path.slice(0, root)); - var wanted = parent.pathNodes(before.path.slice(root)); - var existing = parent.pathNodes(start.path.slice(root)); - while (wanted.length && existing.length && wanted[0].sameMarkup(existing[0])) { - wanted.shift(); - existing.shift(); - } - if (existing.length || wanted.length) tr.step("ancestor", start, end, null, { - depth: existing.length, - types: wanted.map(function (n) { - return n.type; - }), - attrs: wanted.map(function (n) { - return n.attrs; - }) - }); - for (var i = root; i < before.path.length; i++) { - tr.join(before.shorten(i, 1)); - } -} - -// :: (Pos, Pos) → Transform -// Delete the content between the given positions. -_transform.Transform.prototype["delete"] = function (from, to) { - if (from.cmp(to)) this.replace(from, to); - return this; -}; - -// :: (Pos, Pos, Node, Pos, Pos) → Transform -// Replace the part of the document between `from` and `to` with the -// part of the `source` between `start` and `end`. -_transform.Transform.prototype.replace = function (from, to, source, start, end) { - var repl = undefined, - depth = undefined, - doc = this.doc, - maxDepth = (0, _tree.samePathDepth)(from, to); - if (source) { - ; - var _buildInserted = buildInserted(doc.pathNodes(from.path), source, start, end); - - repl = _buildInserted.repl; - depth = _buildInserted.depth; - - while (depth > maxDepth) { - if (repl.content.size) repl = { content: _model.Fragment.from(doc.path(from.path.slice(0, depth)).copy(repl.content)), - openLeft: repl.openLeft + 1, openRight: repl.openRight + 1 }; - depth--; - } - } else { - repl = nullRepl; - depth = maxDepth; - } - var root = from.shorten(depth), - docAfter = doc, - after = to; - if (repl.content.size || (0, _tree.replaceHasEffect)(doc, from, to)) { - var result = this.step("replace", from, to, root, repl); - docAfter = result.doc; - after = result.map.map(to).pos; - } - - // If no text nodes before or after end of replacement, don't glue text - if (!doc.path(to.path).isTextblock) return this; - if (!(repl.content.size ? source.path(end.path).isTextblock : doc.path(from.path).isTextblock)) return this; - - var nodesAfter = doc.path(root.path).pathNodes(to.path.slice(depth)).slice(1); - var nodesBefore = undefined; - if (repl.content.size) { - var inserted = repl.content; - nodesBefore = []; - for (var i = 0; i < repl.openRight; i++) { - var last = inserted.child(inserted.size - 1); - nodesBefore.push(last); - inserted = last.content; - } - } else { - nodesBefore = doc.path(root.path).pathNodes(from.path.slice(depth)).slice(1); - } - - if (nodesBefore.length && (nodesAfter.length != nodesBefore.length || !nodesAfter.every(function (n, i) { - return n.sameMarkup(nodesBefore[i]); - }))) { - var _after$shorten = after.shorten(root.depth); - - var path = _after$shorten.path; - var offset = _after$shorten.offset;var before = undefined; - for (var node = docAfter.path(path), i = 0;; i++) { - if (i == nodesBefore.length) { - before = new _model.Pos(path, offset); - break; - } - path.push(offset - 1); - node = node.child(offset - 1); - offset = node.size; - } - moveText(this, docAfter, before, after); - } - return this; -}; - -// :: (Pos, Pos, union) → Transform -// Replace the given sibling range (position ponting into the same -// parent) with the given content, which may be a fragment, node, or -// array of nodes. -_transform.Transform.prototype.replaceWith = function (from, to, content) { - if (!(content instanceof _model.Fragment)) content = _model.Fragment.from(content); - if (!_model.Pos.samePath(from.path, to.path)) return this; - this.step("replace", from, to, from, { content: content, openLeft: 0, openRight: 0 }); - return this; -}; - -// :: (Pos, union) → Transform -// Insert the given content at the `pos`. -_transform.Transform.prototype.insert = function (pos, content) { - return this.replaceWith(pos, pos, content); -}; - -// :: (Pos, string) → Transform -// Insert the given text at `pos`, inheriting the marks of the -// existing content at that position. -_transform.Transform.prototype.insertText = function (pos, text) { - return this.insert(pos, this.doc.type.schema.text(text, this.doc.marksAt(pos))); -}; - -// :: (Pos, Node) → Transform -// Insert the given node at `pos`, inheriting the marks of the -// existing content at that position. -_transform.Transform.prototype.insertInline = function (pos, node) { - return this.insert(pos, node.mark(this.doc.marksAt(pos))); -}; - -},{"../model":27,"./map":41,"./step":45,"./transform":46,"./tree":47}],44:[function(require,module,exports){ -"use strict"; - -var _model = require("../model"); - -var _transform = require("./transform"); - -var _step = require("./step"); - -var _map = require("./map"); - -// !! **`split`** -// : Split a block node at `pos`. The parameter, if given, may be -// `{type, ?attrs}` object giving the node type and optionally the -// attributes of the node created to hold the content after the -// split. - -_step.Step.define("split", { - apply: function apply(doc, step) { - var pos = step.pos; - if (pos.depth == 0) return null; - - var _pos$shorten = pos.shorten(); - - var parentPath = _pos$shorten.path; - var offset = _pos$shorten.offset; - - var parent = doc.path(parentPath); - var target = parent.child(offset), - targetSize = target.size; - - var _ref = step.param || target; - - var typeAfter = _ref.type; - var attrsAfter = _ref.attrs; - - var splitAt = pos.offset; - if (splitAt == 0 && !target.type.canBeEmpty || target.type.locked || splitAt == target.size && !typeAfter.canBeEmpty) return null; - var newParent = parent.splice(offset, offset + 1, _model.Fragment.from([target.slice(0, splitAt), typeAfter.create(attrsAfter, target.content.slice(splitAt))])); - var copy = doc.replaceDeep(parentPath, newParent); - - var dest = new _model.Pos(parentPath.concat(offset + 1), 0); - var map = new _map.PosMap([new _map.MovedRange(pos, targetSize - pos.offset, dest), new _map.MovedRange(new _model.Pos(parentPath, offset + 1), newParent.size - 2 - offset, new _model.Pos(parentPath, offset + 2))], [new _map.ReplacedRange(pos, pos, pos, dest, pos, pos.shorten(null, 1))]); - return new _step.StepResult(copy, map); - }, - invert: function invert(step, _oldDoc, map) { - return new _step.Step("join", step.pos, map.map(step.pos).pos); - }, - paramToJSON: function paramToJSON(param) { - return param && { type: param.type.name, attrs: param.attrs }; - }, - paramFromJSON: function paramFromJSON(schema, json) { - return json && { type: schema.nodeType(json.type), attrs: json.attrs }; - } -}); - -// :: (Pos, ?number, ?NodeType, ?Object) → Transform -// Split the node at the given position, and optionally, if `depth` is -// greater than one, any number of nodes above that. By default, the part -// split off will inherit the node type of the original node. This can -// be changed by passing `typeAfter` and `attrsAfter`. -_transform.Transform.prototype.split = function (pos, depth, typeAfter, attrsAfter) { - if (depth === undefined) depth = 1; - - if (depth == 0) return this; - for (var i = 0;; i++) { - this.step("split", null, null, pos, typeAfter && { type: typeAfter, attrs: attrsAfter }); - if (i == depth - 1) return this; - typeAfter = null; - pos = pos.shorten(null, 1); - } -}; - -// :: (Pos, ?number) → Transform -// Split at the given position, _if_ that position isn't already at -// the start or end of a node. If `depth` is greater than one, also do -// so for parent positions above the given position. -_transform.Transform.prototype.splitIfNeeded = function (pos) { - var depth = arguments.length <= 1 || arguments[1] === undefined ? 1 : arguments[1]; - - for (var off = 0; off < depth; off++) { - var here = pos.shorten(pos.depth - off); - if (here.offset && here.offset < this.doc.path(here.path).size) this.step("split", null, null, here); - } - return this; -}; - -},{"../model":27,"./map":41,"./step":45,"./transform":46}],45:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = (function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); - } - }return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; - }; -})(); - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -var _model = require("../model"); - -var _map = require("./map"); - -// ;; A step object wraps an atomic operation. It generally applies -// only to the document it was created for, since the positions -// associated with it will only make sense for that document. - -var Step = (function () { - // :: (string, ?Pos, ?Pos, ?Pos, ?any) - // Build a step. The type should name a [defined](Step.define) step - // type, and the shape of the positions and parameter should be - // appropriate for that type. - - function Step(type, from, to, pos) { - var param = arguments.length <= 4 || arguments[4] === undefined ? null : arguments[4]; - - _classCallCheck(this, Step); - - if (!(type in steps)) throw new Error("Unknown step type: " + type); - // :: string - // The type of the step. - this.type = type; - // :: ?Pos - // The start of the step's range, if any. Which of the three - // optional positions associated with a step a given step type - // uses differs. The way each of these positions is mapped when - // the step is mapped over a [position mapping](#PosMap) depends - // on its role. - this.from = from; - // :: ?Pos - // The end of the step's range. - this.to = to; - // :: ?Pos - // The base position for this step. - this.pos = pos; - // :: ?any - // Extra step-type-specific information associated with the step. - this.param = param; - } - - // ;; #toc=false Objects of this type are returned as the result of - // applying a transform step to a document. - - // :: (Node) → ?StepResult - // Applies this step to the given document, returning a result - // containing the transformed document (the input document is not - // changed) and a `PosMap`. If the step could not meaningfully be - // applied to the given document, this returns `null`. - - _createClass(Step, [{ - key: "apply", - value: function apply(doc) { - return steps[this.type].apply(doc, this); - } - - // :: (Node, PosMap) → Step - // Create an inverted version of this step. Needs the document as it - // was before the step, as well as `PosMap` created by applying the - // step to that document, as input. - }, { - key: "invert", - value: function invert(oldDoc, map) { - return steps[this.type].invert(this, oldDoc, map); - } - - // :: (Mappable) → ?Step - // Map this step through a mappable thing, returning either a - // version of that step with its positions adjusted, or `null` if - // the step was entirely deleted by the mapping. - }, { - key: "map", - value: function map(remapping) { - var allDeleted = true; - var from = null, - to = null, - pos = null; - - if (this.from) { - var result = remapping.map(this.from, 1); - from = result.pos; - if (!result.deleted) allDeleted = false; - } - if (this.to) { - if (this.to.cmp(this.from) == 0) { - to = from; - } else { - var result = remapping.map(this.to, -1); - to = result.pos.max(from); - if (!result.deleted) allDeleted = false; - } - } - if (this.pos) { - if (from && this.pos.cmp(this.from) == 0) { - pos = from; - } else if (to && this.pos.cmp(this.to) == 0) { - pos = to; - } else { - var result = remapping.map(this.pos, 1); - pos = result.pos; - if (!result.deleted) allDeleted = false; - } - } - return allDeleted ? null : new Step(this.type, from, to, pos, this.param); - } - - // :: () → Object - // Create a JSON-serializeable representation of this step. - }, { - key: "toJSON", - value: function toJSON() { - var impl = steps[this.type]; - return { - type: this.type, - from: this.from, - to: this.to, - pos: this.pos, - param: impl.paramToJSON ? impl.paramToJSON(this.param) : this.param - }; - } - - // :: (Schema, Object) → Step - // Deserialize a step from its JSON representation. - }], [{ - key: "fromJSON", - value: function fromJSON(schema, json) { - var impl = steps[json.type]; - return new Step(json.type, json.from && _model.Pos.fromJSON(json.from), json.to && _model.Pos.fromJSON(json.to), json.pos && _model.Pos.fromJSON(json.pos), impl.paramFromJSON ? impl.paramFromJSON(schema, json.param) : json.param); - } - - // :: (string, Object) - // Define a new type of step. Implementation should have the - // following properties: - // - // **`apply`**`(doc: Node, step: Step) → ?StepResult - // : Applies the step to a document. - // **`invert`**`(step: Step, oldDoc: Node, map: PosMap) → Step - // : Create an inverted version of the step. - // **`paramToJSON`**`(param: ?any) → ?Object - // : Serialize this step type's parameter to JSON. - // **`paramFromJSON`**`(schema: Schema, json: ?Object) → ?any - // : Deserialize this step type's parameter from JSON. - }, { - key: "define", - value: function define(type, implementation) { - steps[type] = implementation; - } - }]); - - return Step; -})(); - -exports.Step = Step; - -var StepResult = function StepResult(doc) { - var map = arguments.length <= 1 || arguments[1] === undefined ? _map.nullMap : arguments[1]; - - _classCallCheck(this, StepResult); - - // :: Node The transformed document. - this.doc = doc; - // :: PosMap - // The position map that describes the correspondence between the - // old and the new document. - this.map = map; -}; - -exports.StepResult = StepResult; - -var steps = Object.create(null); - -},{"../model":27,"./map":41}],46:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = (function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); - } - }return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; - }; -})(); - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -var _step2 = require("./step"); - -var _map = require("./map"); - -// ;; A change to a document often consists of a series of -// [steps](#Step). This class provides a convenience abstraction to -// build up and track such an array of steps. A `Transform` object -// implements `Mappable`. -// -// The high-level transforming methods return the `Transform` object -// itself, so that they can be chained. - -var Transform = (function () { - // :: (Node) - // Create a transformation that starts with the given document. - - function Transform(doc) { - _classCallCheck(this, Transform); - - // :: [Step] - // The accumulated steps. - this.steps = []; - // :: [Node] - // The individual document versions. Always has a length one more - // than `steps`, since it also includes the original starting - // document. - this.docs = [doc]; - // :: [PosMap] - // The position maps produced by the steps. Has the same length as - // `steps`. - this.maps = []; - } - - // :: Node - // The current version of the transformed document. - - _createClass(Transform, [{ - key: "step", - - // :: (Step) → ?StepResult - // Add a step to this transformation. If the step can be - // [applied](#Step.apply) to the current document, the result of - // applying it is returned, and an element is added to the - // [`steps`](#Transform.steps), [`docs`](#Transform.docs), and - // [`maps`](#Transform.maps) arrays. - value: function step(_step, from, to, pos, param) { - if (typeof _step == "string") _step = new _step2.Step(_step, from, to, pos, param); - var result = _step.apply(this.doc); - if (result) { - this.steps.push(_step); - this.maps.push(result.map); - this.docs.push(result.doc); - } - return result; - } - - // :: (Pos, ?number) → MapResult - // Map a position through the whole transformation (all the position - // maps in [`maps`](#Transform.maps)), and return the result. - }, { - key: "map", - value: function map(pos, bias) { - var deleted = false; - for (var i = 0; i < this.maps.length; i++) { - var result = this.maps[i].map(pos, bias); - pos = result.pos; - if (result.deleted) deleted = true; - } - return new _map.MapResult(pos, deleted); - } - }, { - key: "doc", - get: function get() { - return this.docs[this.docs.length - 1]; - } - - // :: Node - // The original input document. - }, { - key: "before", - get: function get() { - return this.docs[0]; - } - }]); - - return Transform; -})(); - -exports.Transform = Transform; - -},{"./map":41,"./step":45}],47:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.copyStructure = copyStructure; -exports.copyInline = copyInline; -exports.isFlatRange = isFlatRange; -exports.replaceHasEffect = replaceHasEffect; -exports.samePathDepth = samePathDepth; - -var _model = require("../model"); - -function copyStructure(node, from, to, f) { - var depth = arguments.length <= 4 || arguments[4] === undefined ? 0 : arguments[4]; - - if (node.isTextblock) { - return f(node, from ? from.offset : 0, to ? to.offset : node.size); - } else { - if (!node.size) return node; - var start = from ? from.path[depth] : 0; - var end = to ? to.path[depth] + 1 : node.size; - var content = node.content.toArray(0, start); - for (var iter = node.iter(start, end), child = undefined; child = iter.next().value;) { - var passFrom = iter.offset - child.width == start ? from : null; - var passTo = iter.offset == end ? to : null; - content.push(copyStructure(child, passFrom, passTo, f, depth + 1)); - } - return node.copy(_model.Fragment.fromArray(content.concat(node.content.toArray(end)))); - } -} - -function copyInline(node, from, to, f) { - return node.splice(from, to, node.content.slice(from, to).map(f)); -} - -function isFlatRange(from, to) { - if (from.path.length != to.path.length) return false; - for (var i = 0; i < from.path.length; i++) { - if (from.path[i] != to.path[i]) return false; - }return from.offset <= to.offset; -} - -function canBeJoined(node, offset, depth) { - if (!depth || offset == 0 || offset == node.size) return false; - var left = node.child(offset - 1), - right = node.child(offset); - return left.sameMarkup(right); -} - -function replaceHasEffect(doc, from, to) { - for (var depth = 0, node = doc;; depth++) { - var fromEnd = depth == from.depth, - toEnd = depth == to.depth; - if (fromEnd || toEnd || from.path[depth] != to.path[depth]) { - var gapStart = undefined, - gapEnd = undefined; - if (fromEnd) { - gapStart = from.offset; - } else { - gapStart = from.path[depth] + 1; - for (var i = depth + 1, n = node.child(gapStart - 1); i <= from.path.length; i++) { - if (i == from.path.length) { - if (from.offset < n.size) return true; - } else { - if (from.path[i] + 1 < n.size) return true; - n = n.child(from.path[i]); - } - } - } - if (toEnd) { - gapEnd = to.offset; - } else { - gapEnd = to.path[depth]; - for (var i = depth + 1; i <= to.path.length; i++) { - if ((i == to.path.length ? to.offset : to.path[i]) > 0) return true; - } - } - if (gapStart != gapEnd) return true; - return canBeJoined(node, gapStart, Math.min(from.depth, to.depth) - depth); - } else { - node = node.child(from.path[depth]); - } - } -} - -function samePathDepth(a, b) { - for (var i = 0;; i++) { - if (i == a.path.length || i == b.path.length || a.path[i] != b.path[i]) return i; - } -} - -},{"../model":27}],48:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = (function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); - } - }return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; - }; -})(); - -var _get = function get(_x, _x2, _x3) { - var _again = true;_function: while (_again) { - var object = _x, - property = _x2, - receiver = _x3;_again = false;if (object === null) object = Function.prototype;var desc = Object.getOwnPropertyDescriptor(object, property);if (desc === undefined) { - var parent = Object.getPrototypeOf(object);if (parent === null) { - return undefined; - } else { - _x = parent;_x2 = property;_x3 = receiver;_again = true;desc = parent = undefined;continue _function; - } - } else if ("value" in desc) { - return desc.value; - } else { - var getter = desc.get;if (getter === undefined) { - return undefined; - }return getter.call(receiver); - } - } -}; - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -function _inherits(subClass, superClass) { - if (typeof superClass !== "function" && superClass !== null) { - throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); - }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; -} - -var ProseMirrorError = (function (_Error) { - _inherits(ProseMirrorError, _Error); - - function ProseMirrorError(message) { - _classCallCheck(this, ProseMirrorError); - - _get(Object.getPrototypeOf(ProseMirrorError.prototype), "constructor", this).call(this, message); - if (this.message != message) { - this.message = message; - if (Error.captureStackTrace) Error.captureStackTrace(this, this.name);else this.stack = new Error(message).stack; - } - } - - _createClass(ProseMirrorError, [{ - key: "name", - get: function get() { - return this.constructor.name || functionName(this.constructor) || "ProseMirrorError"; - } - }], [{ - key: "raise", - value: function raise(message) { - throw new this(message); - } - }]); - - return ProseMirrorError; -})(Error); - -exports.ProseMirrorError = ProseMirrorError; - -function functionName(f) { - var match = /^function (\w+)/.exec(f.toString()); - return match && match[1]; -} - -},{}],49:[function(require,module,exports){ -// ;; #path=EventMixin #kind=interface -// A set of methods for objects that emit events. Added by calling -// `eventMixin` on a constructor. - -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.eventMixin = eventMixin; -var methods = { - // :: (type: string, handler: (...args: [any])) #path=EventMixin.on - // Register an event handler for the given event type. - on: function on(type, f) { - var map = this._handlers || (this._handlers = {}); - var arr = map[type] || (map[type] = []); - arr.push(f); - }, - - // :: (type: string, handler: (...args: [any])) #path=EventMixin.off - // Unregister an event handler for the given event type. - off: function off(type, f) { - var arr = this._handlers && this._handlers[type]; - if (arr) for (var i = 0; i < arr.length; ++i) { - if (arr[i] == f) { - arr.splice(i, 1);break; - } - } - }, - - // :: (type: string, ...args: [any]) #path=EventMixin.signal - // Signal an event of the given type, passing any number of - // arguments. Will call the handlers for the event, passing them the - // arguments. - signal: function signal(type) { - var arr = this._handlers && this._handlers[type]; - - for (var _len = arguments.length, values = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - values[_key - 1] = arguments[_key]; - } - - if (arr) for (var i = 0; i < arr.length; ++i) { - arr[i].apply(arr, values); - } - }, - - // :: (type: string, ...args: [any]) #path=EventMixin.signalHandleable - // Signal a handleable event of the given type. All handlers for the - // event will be called with the given arguments, until one of them - // returns something that is not the value `false`. When that - // happens, the return value of that handler is returned. If that - // does not happen, `false` is returned. - signalHandleable: function signalHandleable(type) { - var arr = this._handlers && this._handlers[type]; - if (arr) { - for (var _len2 = arguments.length, values = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { - values[_key2 - 1] = arguments[_key2]; - } - - for (var i = 0; i < arr.length; ++i) { - var result = arr[i].apply(arr, values); - if (result !== false) return result; - } - }return false; - }, - - // :: (type: string) → bool #path=EventMixin.hasHandler - // Query whether there are any handlers for this event type. - hasHandler: function hasHandler(type) { - var arr = this._handlers && this._handlers[type]; - return arr && arr.length > 0; - } -}; - -// :: (()) -// Add the methods in the `EventMixin` interface to the prototype -// object of the given constructor. - -function eventMixin(ctor) { - var proto = ctor.prototype; - for (var prop in methods) if (methods.hasOwnProperty(prop)) proto[prop] = methods[prop]; -} - -},{}],50:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = (function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); - } - }return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; - }; -})(); - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -var Map = window.Map || (function () { - function _class() { - _classCallCheck(this, _class); - - this.content = []; - } - - _createClass(_class, [{ - key: "set", - value: function set(key, value) { - var found = this.find(key); - if (found > -1) this.content[found + 1] = value;else this.content.push(key, value); - } - }, { - key: "get", - value: function get(key) { - var found = this.find(key); - return found == -1 ? undefined : this.content[found + 1]; - } - }, { - key: "has", - value: function has(key) { - return this.find(key) > -1; - } - }, { - key: "find", - value: function find(key) { - for (var i = 0; i < this.content.length; i += 2) { - if (this.content[i] === key) return i; - } - } - }, { - key: "clear", - value: function clear() { - this.content.length = 0; - } - }, { - key: "size", - get: function get() { - return this.content.length / 2; - } - }]); - - return _class; -})(); -exports.Map = Map; - -},{}],51:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports["default"] = sortedInsert; - -function sortedInsert(array, elt, compare) { - var i = 0; - for (; i < array.length; i++) if (compare(array[i], elt) > 0) break; - array.splice(i, 0, elt); -} - -module.exports = exports["default"]; - -},{}],52:[function(require,module,exports){ -"use strict"; - -var _gitProsemirrorDistEdit = require("../../../git/prosemirror/dist/edit"); - -var _gitProsemirrorDistDom = require("../../../git/prosemirror/dist/dom"); - -require("../../../git/prosemirror/dist/menu/tooltipmenu"); - -require("../../../git/prosemirror/dist/menu/menubar"); - -require("../../../git/prosemirror/dist/inputrules/autoinput"); - -var _gitProsemirrorDistModel = require("../../../git/prosemirror/dist/model"); - -var _widgets = require("./widgets"); - -var widgetsSpec = new _gitProsemirrorDistModel.SchemaSpec({ - doc: _gitProsemirrorDistModel.Doc, - blockquote: _gitProsemirrorDistModel.BlockQuote, - ordered_list: _gitProsemirrorDistModel.OrderedList, - bullet_list: _gitProsemirrorDistModel.BulletList, - list_item: _gitProsemirrorDistModel.ListItem, - horizontal_rule: _gitProsemirrorDistModel.HorizontalRule, - - paragraph: _gitProsemirrorDistModel.Paragraph, - heading: _gitProsemirrorDistModel.Heading, - - text: _gitProsemirrorDistModel.Text, - image: _widgets.Image, - hard_break: _gitProsemirrorDistModel.HardBreak, - - input: _widgets.Input, - textfield: _widgets.TextField, - textarea: _widgets.TextArea, - checkbox: _widgets.CheckBox, - radiobutton: _widgets.RadioButton, - select: _widgets.Select, - inlinemath: _widgets.InlineMath, - blockmath: _widgets.BlockMath, - iframe: _widgets.IFrame, - carryforward: _widgets.CarryForward, - choice: _widgets.Choice, - multiplechoice: _widgets.MultipleChoice, - scale: _widgets.Scale, - checkitem: _widgets.CheckItem, - checklist: _widgets.CheckList, - spreadsheet: _widgets.SpreadSheet, - widget: _widgets.Widget -}, { - em: _gitProsemirrorDistModel.EmMark, - strong: _gitProsemirrorDistModel.StrongMark, - link: _gitProsemirrorDistModel.LinkMark, - code: _gitProsemirrorDistModel.CodeMark -}); - -var widgetSchema = new _gitProsemirrorDistModel.Schema(widgetsSpec); - -var pm = window.pm = new _gitProsemirrorDistEdit.ProseMirror({ - place: document.querySelector("#editor"), - menuBar: true, - doc: document.querySelector("#content").innerHTML, - docFormat: "html", - schema: widgetSchema, - autoInput: true -}); - -(0, _gitProsemirrorDistDom.insertCSS)("\n\t\t\ndiv.ProseMirror-select-menu {\n position: absolute;\n background: #EEE;\n color: black;\n padding: 2px 2px;\n z-index: 15;\n}\n\ndiv.ProseMirror-select-menu div {\n cursor: pointer;\n padding: 0 1em 0 2px;\n}\n\ndiv.ProseMirror-select-menu div:hover {\n background: white;\n}\n\ndiv.ProseMirror-menu form {\n\tbackground: #EEE;\n\twidth: 300px;\n\tborder: 1px solid #AAA\n}\n\ndiv.ProseMirror-menu form select {\n\tbackground: white;\n}\n\ndiv.ProseMirror-menubar-sliding {\n -webkit-transition: right 0.2s ease-out;\n -moz-transition: right 0.2s ease-out;\n transition: right 0.2s ease-out;\n position: relative;\n left: 100%;\n width: 100%;\n box-sizing: -moz-border-box;\n box-sizing: border-box;\n padding-left: 16px;\n background: white;\n}\n\n\n"); - -},{"../../../git/prosemirror/dist/dom":1,"../../../git/prosemirror/dist/edit":9,"../../../git/prosemirror/dist/inputrules/autoinput":16,"../../../git/prosemirror/dist/menu/menubar":20,"../../../git/prosemirror/dist/menu/tooltipmenu":22,"../../../git/prosemirror/dist/model":27,"./widgets":60}],53:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.defParser = defParser; -exports.defParamsClick = defParamsClick; - -var _gitProsemirrorDistMenuMenu = require("../../../../git/prosemirror/dist/menu/menu"); - -var _gitProsemirrorDistModel = require("../../../../git/prosemirror/dist/model"); - -var _gitProsemirrorDistEditSelection = require("../../../../git/prosemirror/dist/edit/selection"); - -var andScroll = { scrollIntoView: true }; - -exports.andScroll = andScroll; -MathJax.Hub.Queue(function () { - MathJax.Hub.Config({ - tex2jax: { - displayMath: [["\\[", "\\]"]], - inlineMath: [["\\(", "\\)"]], - processEscapes: true - }, - displayAlign: "left" - }); -}); - -function defParser(type, tag, cls) { - type.register("parseDOM", { - tag: tag, - rank: 25, - parse: function parse(dom, context, type, attrs) { - var contains = dom.classList.contains(cls); - if (!contains) return false; - context.insertFrom(dom, type, attrs); - } - }); -} - -function selectClickedNode(pm, e) { - var pos = (0, _gitProsemirrorDistEditSelection.selectableNodeAbove)(pm, e.target, { left: e.clientX, top: e.clientY }, true); - if (!pos) return pm.sel.pollForUpdate(); - - var _pm$selection = pm.selection; - var node = _pm$selection.node; - var from = _pm$selection.from; - - if (node && pos.depth >= from.depth && pos.shorten(from.depth).cmp(from) == 0) { - if (from.depth == 0) return pm.sel.pollForUpdate(); - pos = from.shorten(); - } - - pm.setNodeSelection(pos); - pm.focus(); - e.preventDefault(); -} - -function defParamsClick(type) { - type.prototype.handleClick = function (pm, e, path, node) { - var menu = pm.mod.menuBar.menu; - var cmd = pm.commands["insert" + type.name]; - if (menu && cmd) { - selectClickedNode(pm, e); - menu.enter((0, _gitProsemirrorDistMenuMenu.readParams)(cmd)); - return true; - } else return false; - }; -} - -},{"../../../../git/prosemirror/dist/edit/selection":15,"../../../../git/prosemirror/dist/menu/menu":19,"../../../../git/prosemirror/dist/model":27}],54:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var _gitProsemirrorDistModel = require("../../../../git/prosemirror/dist/model"); - -var _gitProsemirrorDistDom = require("../../../../git/prosemirror/dist/dom"); - -var _utils = require("../utils"); - -var BlockMath = (function (_Block) { - _inherits(BlockMath, _Block); - - function BlockMath() { - _classCallCheck(this, BlockMath); - - _get(Object.getPrototypeOf(BlockMath.prototype), "constructor", this).apply(this, arguments); - } - - return BlockMath; -})(_gitProsemirrorDistModel.Block); - -exports.BlockMath = BlockMath; - -BlockMath.attributes = { - tex: new _gitProsemirrorDistModel.Attribute({ "default": "" }) -}; - -(0, _utils.defParser)(BlockMath, "div", "widgets-blockmath"); - -BlockMath.prototype.serializeDOM = function (node) { - if (node.rendered) { - node.rendered = node.rendered.cloneNode(true); - } else { - node.rendered = (0, _gitProsemirrorDistDom.elt)("div", { "class": "widgets-blockmath" }, "\\[" + node.attrs.tex + "\\]"); - // wait until node is attached to document to render - MathJax.Hub.Queue(["Delay", MathJax.Callback, 100], ["Typeset", MathJax.Hub, node.rendered]); - } - return node.rendered; -}; - -BlockMath.register("command", { - name: "insertBlockMath", - label: "BlockMath", - run: function run(pm, tex) { - return pm.tr.replaceSelection(this.create({ tex: tex })).apply(_utils.andScroll); - }, - params: [{ label: "Latex Expression", type: "text" }], - prefillParams: function prefillParams(pm) { - var node = pm.selection.node; - - if (node) return [node.attrs.tex]; - } -}); - -(0, _utils.defParamsClick)(BlockMath); - -(0, _gitProsemirrorDistDom.insertCSS)("\n\n.widgets-blockmath {}\n\n"); - -},{"../../../../git/prosemirror/dist/dom":1,"../../../../git/prosemirror/dist/model":27,"../utils":53}],55:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var _gitProsemirrorDistModel = require("../../../../git/prosemirror/dist/model"); - -var _gitProsemirrorDistDom = require("../../../../git/prosemirror/dist/dom"); - -var _utils = require("../utils"); - -var carryOptions = []; - -function getCarryOptions(names) { - return names.map(function (w) { - return { value: w, label: w }; - }); -} - -var CarryForward = (function (_Inline) { - _inherits(CarryForward, _Inline); - - function CarryForward() { - _classCallCheck(this, CarryForward); - - _get(Object.getPrototypeOf(CarryForward.prototype), "constructor", this).apply(this, arguments); - } - - return CarryForward; -})(_gitProsemirrorDistModel.Inline); - -exports.CarryForward = CarryForward; - -CarryForward.attributes = { - name: new _gitProsemirrorDistModel.Attribute() -}; - -(0, _utils.defParser)(CarryForward, "thinkspace", "widgets-carryforward"); - -CarryForward.prototype.serializeDOM = function (node) { - return (0, _gitProsemirrorDistDom.elt)("thinkspace", { "class": "widgets-carryforward", name: node.attrs.name }, (0, _gitProsemirrorDistDom.elt)("img", { src: "forward.png", width: 16, height: 16, title: "Carry forward " + node.attrs.name })); -}; - -CarryForward.register("command", { - name: "insertCarryForward", - label: "CarryForward", - run: function run(pm, name) { - return pm.tr.replaceSelection(this.create({ name: name })).apply(_utils.andScroll); - }, - params: [{ label: "Input name", type: "select", options: carryOptions }], - prefillParams: function prefillParams(pm) { - pm.commands.insertCarryForward.spec.params[0].options = getCarryOptions(["test1", "test2"]); - var node = pm.selection.node; - - if (node) { - return [node.attrs.name]; - } - } -}); - -(0, _utils.defParamsClick)(CarryForward); - -(0, _gitProsemirrorDistDom.insertCSS)("\n\n.widgets-carryforward {}\n\n"); - -},{"../../../../git/prosemirror/dist/dom":1,"../../../../git/prosemirror/dist/model":27,"../utils":53}],56:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var _gitProsemirrorDistModel = require("../../../../git/prosemirror/dist/model"); - -var _gitProsemirrorDistDom = require("../../../../git/prosemirror/dist/dom"); - -var _input = require("./input"); - -var _utils = require("../utils"); - -var CheckBox = (function (_Input) { - _inherits(CheckBox, _Input); - - function CheckBox() { - _classCallCheck(this, CheckBox); - - _get(Object.getPrototypeOf(CheckBox.prototype), "constructor", this).apply(this, arguments); - } - - return CheckBox; -})(_input.Input); - -exports.CheckBox = CheckBox; - -CheckBox.attributes = { - name: new _gitProsemirrorDistModel.Attribute(), - type: new _gitProsemirrorDistModel.Attribute({ "default": "checkbox" }), - value: new _gitProsemirrorDistModel.Attribute({ "default": 1 }), - "class": new _gitProsemirrorDistModel.Attribute({ "default": "widgets-checkbox" }) -}; - -(0, _utils.defParser)(CheckBox, "input", "widgets-checkbox"); - -// Checkbox inherits serializer from input - -CheckBox.register("command", { - name: "insertCheckBox", - label: "CheckBox", - run: function run(pm, name, label, loc) { - return pm.tr.replaceSelection(this.create({ name: name, label: label, loc: loc })).apply(_utils.andScroll); - }, - params: [{ label: "Name", type: "text" }], - prefillParams: function prefillParams(pm) { - var node = pm.selection.node; - - if (node) return [node.attrs.name, node.attrs.label, node.attrs.loc]; - } -}); - -(0, _utils.defParamsClick)(CheckBox); - -(0, _gitProsemirrorDistDom.insertCSS)("\n\n.widgets-checkbox {}\n\n"); - -},{"../../../../git/prosemirror/dist/dom":1,"../../../../git/prosemirror/dist/model":27,"../utils":53,"./input":62}],57:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - -var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var _gitProsemirrorDistModel = require("../../../../git/prosemirror/dist/model"); - -var _gitProsemirrorDistDom = require("../../../../git/prosemirror/dist/dom"); - -var _utils = require("../utils"); - -var CheckItem = (function (_Paragraph) { - _inherits(CheckItem, _Paragraph); - - function CheckItem() { - _classCallCheck(this, CheckItem); - - _get(Object.getPrototypeOf(CheckItem.prototype), "constructor", this).apply(this, arguments); - } - - _createClass(CheckItem, [{ - key: "create", - value: function create(attrs, content, marks) { - if (attrs.value > 0) content = [this.schema.node("checkbox", attrs)]; - return _get(Object.getPrototypeOf(CheckItem.prototype), "create", this).call(this, attrs, content, marks); - } - }], [{ - key: "kind", - get: function get() { - return "."; - } - }]); - - return CheckItem; -})(_gitProsemirrorDistModel.Paragraph); - -exports.CheckItem = CheckItem; - -CheckItem.attributes = { - name: new _gitProsemirrorDistModel.Attribute(), - value: new _gitProsemirrorDistModel.Attribute() -}; - -var CheckList = (function (_Block) { - _inherits(CheckList, _Block); - - function CheckList() { - _classCallCheck(this, CheckList); - - _get(Object.getPrototypeOf(CheckList.prototype), "constructor", this).apply(this, arguments); - } - - _createClass(CheckList, null, [{ - key: "contains", - get: function get() { - return "checkitem"; - } - }]); - - return CheckList; -})(_gitProsemirrorDistModel.Block); - -exports.CheckList = CheckList; - -CheckList.attributes = { - name: new _gitProsemirrorDistModel.Attribute(), - layout: new _gitProsemirrorDistModel.Attribute({ "default": "vertical" }) -}; - -(0, _utils.defParser)(CheckItem, "div", "widgets-checkitem"); -(0, _utils.defParser)(CheckList, "div", "widgets-checklist"); - -CheckItem.prototype.serializeDOM = function (node, s) { - return s.renderAs(node, "p", { - name: node.attrs.name + "-" + node.attrs.value, - value: node.attrs.value, - "class": "widgets-checkitem" - }); -}; - -CheckList.prototype.serializeDOM = function (node, s) { - return s.renderAs(node, "div", { - name: node.attrs.name, - layout: node.attrs.layout, - "class": "widgets-checklist" - }); -}; - -CheckItem.register("command", { - name: "splitCheckitem", - label: "Split the current checkitem", - run: function run(pm) { - var _pm$selection = pm.selection; - var node = _pm$selection.node; - var from = _pm$selection.from; - var to = _pm$selection.to; - - if (node && node.isBlock || from.path.length < 2 || !_gitProsemirrorDistModel.Pos.samePath(from.path, to.path)) return false; - var toParent = from.shorten(), - grandParent = pm.doc.path(toParent.path); - console.log(grandParent.type.name); - if (grandParent.type.name != "checklist") return false; - return pm.tr["delete"](from, to).split(from, 1, pm.schema.nodes.checkitem, { name: grandParent.attrs.name, value: grandParent.size }).apply(_utils.andScroll); - }, - key: "Enter(50)" -}); - -CheckList.register("command", { - name: "insertCheckList", - label: "CheckList", - run: function run(pm, name, layout) { - var chkitem = pm.schema.nodes.checkitem.create({ name: name, value: 0 }); - return pm.tr.replaceSelection(this.create({ name: name + "-0", layout: layout }, chkitem)).apply(_utils.andScroll); - }, - params: [{ label: "Name", type: "text" }, { label: "Layout (vertical, horizontal)", type: "select", options: [{ value: "horizontal", label: "horizontal" }, { value: "vertical", label: "vertical" }] }], - prefillParams: function prefillParams(pm) { - var node = pm.selection.node; - - if (node) return [node.attrs.name, node.attrs.layout]; - } -}); - -CheckItem.register("command", { - name: "splitCheckItem", - label: "Split the current checkitem", - run: function run(pm) { - var _pm$selection2 = pm.selection; - var node = _pm$selection2.node; - var from = _pm$selection2.from; - var to = _pm$selection2.to; - - if (node && node.isBlock || from.path.length < 2 || !_gitProsemirrorDistModel.Pos.samePath(from.path, to.path)) return false; - var toParent = from.shorten(), - grandParent = pm.doc.path(toParent.path); - return pm.tr["delete"](from, to).split(from, 1, pm.schema.nodes.checkitem, { - name: grandParent.attrs.name + "-" + grandParent.size, - value: grandParent.size }).apply(_utils.andScroll); - }, - key: "Enter(50)" -}); - -CheckItem.register("command", { - name: "deleteCheckItem", - label: "delete this checkitem or checklist", - run: function run(pm) { - var _pm$selection3 = pm.selection; - var head = _pm$selection3.head; - var empty = _pm$selection3.empty; - - if (!empty || head.offset > 1) return false; - // Find the node before this one - var before = undefined, - cut = undefined; - for (var i = head.path.length - 1; !before && i >= 0; i--) { - if (head.path[i] > 0) { - cut = head.shorten(i); - before = pm.doc.path(cut.path).child(cut.offset - 1); - } - }var mc = pm.doc.path(cut.path).child(cut.offset); - // if top choice, delete whole question if only one choice - if (mc.type.name == "checkitem") { - return pm.tr["delete"](cut, cut.move(1)).apply(_utils.andScroll); - } else { - // don't delete question if more than one choice - if (mc.size == 1) { - return pm.tr["delete"](cut, cut.move(1)).apply(_utils.andScroll); - } else return false; - } - }, - key: ["Backspace(50)", "Mod-Backspace(50)"] -}); - -(0, _gitProsemirrorDistDom.insertCSS)("\n\n.widgets-checkitem {}\n.widgets-checklist {}\n\n"); - -},{"../../../../git/prosemirror/dist/dom":1,"../../../../git/prosemirror/dist/model":27,"../utils":53}],58:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var _gitProsemirrorDistModel = require("../../../../git/prosemirror/dist/model"); - -var _gitProsemirrorDistDom = require("../../../../git/prosemirror/dist/dom"); - -var _utils = require("../utils"); - -var IFrame = (function (_Block) { - _inherits(IFrame, _Block); - - function IFrame() { - _classCallCheck(this, IFrame); - - _get(Object.getPrototypeOf(IFrame.prototype), "constructor", this).apply(this, arguments); - } - - return IFrame; -})(_gitProsemirrorDistModel.Block); - -exports.IFrame = IFrame; - -IFrame.attributes = { - src: new _gitProsemirrorDistModel.Attribute({ "default": "" }), - width: new _gitProsemirrorDistModel.Attribute({ "default": 200 }), - height: new _gitProsemirrorDistModel.Attribute({ "default": 200 }) -}; - -(0, _utils.defParser)(IFrame, "iframe", "widgets-iframe"); - -IFrame.prototype.serializeDOM = function (node, s) { - return s.renderAs(node, "iframe", { - src: node.attrs.src, - width: node.attrs.width, - height: node.attrs.height, - content: "text/html;charset=UTF-8", - "class": "iframe", - frameborder: "1", - allowfullscreen: "1" - }); -}; - -IFrame.register("command", { - name: "insertIFrame", - label: "show websites, youTube, GoogleMaps,...", - run: function run(pm, src, width, height) { - return pm.tr.replaceSelection(this.create({ src: src, width: width, height: height })).apply(_utils.andScroll); - }, - params: [{ label: "Link (website, youTube, Google Maps ...)", type: "text" }, { label: "Width in pixels", type: "text", "default": 200 }, { label: "Height in pixels", type: "text", "default": 200 }], - prefillParams: function prefillParams(pm) { - var node = pm.selection.node; - - if (node) return [node.attrs.src, node.attrs.width, node.attrs.height]; - } -}); - -(0, _utils.defParamsClick)(IFrame); - -(0, _gitProsemirrorDistDom.insertCSS)("\n\n.widgets-iframe {}\n\n"); - -},{"../../../../git/prosemirror/dist/dom":1,"../../../../git/prosemirror/dist/model":27,"../utils":53}],59:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var _gitProsemirrorDistModel = require("../../../../git/prosemirror/dist/model"); - -var _gitProsemirrorDistDom = require("../../../../git/prosemirror/dist/dom"); - -var _utils = require("../utils"); - -var Image = (function (_Inline) { - _inherits(Image, _Inline); - - function Image() { - _classCallCheck(this, Image); - - _get(Object.getPrototypeOf(Image.prototype), "constructor", this).apply(this, arguments); - } - - return Image; -})(_gitProsemirrorDistModel.Inline); - -exports.Image = Image; - -Image.attributes = { - src: new _gitProsemirrorDistModel.Attribute(), - alt: new _gitProsemirrorDistModel.Attribute({ "default": "" }), - title: new _gitProsemirrorDistModel.Attribute({ "default": "" }), - "class": new _gitProsemirrorDistModel.Attribute({ "default": "widgets-img" }) -}; - -(0, _utils.defParser)(Image, "img", "widgets-img"); - -Image.prototype.serializeDOM = function (node, s) { - return s.renderAs(node, "img", node.attrs); -}; - -Image.register("command", { - name: "insertImage", - label: "Insert image", - run: function run(pm, src, alt, title) { - return pm.tr.replaceSelection(this.create({ src: src, title: title, alt: alt })).apply(_utils.andScroll); - }, - params: [{ label: "Image URL", type: "text" }, { label: "Description / alternative text", type: "text", "default": "" }, { label: "Title", type: "text", "default": "" }], - select: function select(pm) { - return pm.doc.path(pm.selection.from.path).type.canContainType(this); - }, - prefillParams: function prefillParams(pm) { - var node = pm.selection.node; - - if (node && node.type == this) return [node.attrs.src, node.attrs.alt, node.attrs.title]; - } -}); - -(0, _utils.defParamsClick)(Image); - -(0, _gitProsemirrorDistDom.insertCSS)("\n\n.widgets-image {}\n\n"); - -},{"../../../../git/prosemirror/dist/dom":1,"../../../../git/prosemirror/dist/model":27,"../utils":53}],60:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _blockmath = require("./blockmath"); - -Object.defineProperty(exports, "BlockMath", { - enumerable: true, - get: function get() { - return _blockmath.BlockMath; - } -}); - -var _checkbox = require("./checkbox"); - -Object.defineProperty(exports, "CheckBox", { - enumerable: true, - get: function get() { - return _checkbox.CheckBox; - } -}); - -var _checklist = require("./checklist"); - -Object.defineProperty(exports, "CheckList", { - enumerable: true, - get: function get() { - return _checklist.CheckList; - } -}); -Object.defineProperty(exports, "CheckItem", { - enumerable: true, - get: function get() { - return _checklist.CheckItem; - } -}); - -var _iframe = require("./iframe"); - -Object.defineProperty(exports, "IFrame", { - enumerable: true, - get: function get() { - return _iframe.IFrame; - } -}); - -var _inlinemath = require("./inlinemath"); - -Object.defineProperty(exports, "InlineMath", { - enumerable: true, - get: function get() { - return _inlinemath.InlineMath; - } -}); - -var _input = require("./input"); - -Object.defineProperty(exports, "Input", { - enumerable: true, - get: function get() { - return _input.Input; - } -}); - -var _multiplechoice = require("./multiplechoice"); - -Object.defineProperty(exports, "MultipleChoice", { - enumerable: true, - get: function get() { - return _multiplechoice.MultipleChoice; - } -}); -Object.defineProperty(exports, "Choice", { - enumerable: true, - get: function get() { - return _multiplechoice.Choice; - } -}); - -var _radiobutton = require("./radiobutton"); - -Object.defineProperty(exports, "RadioButton", { - enumerable: true, - get: function get() { - return _radiobutton.RadioButton; - } -}); - -var _scale = require("./scale"); - -Object.defineProperty(exports, "Scale", { - enumerable: true, - get: function get() { - return _scale.Scale; - } -}); - -var _select = require("./select"); - -Object.defineProperty(exports, "Select", { - enumerable: true, - get: function get() { - return _select.Select; - } -}); - -var _textarea = require("./textarea"); - -Object.defineProperty(exports, "TextArea", { - enumerable: true, - get: function get() { - return _textarea.TextArea; - } -}); - -var _textfield = require("./textfield"); - -Object.defineProperty(exports, "TextField", { - enumerable: true, - get: function get() { - return _textfield.TextField; - } -}); - -var _image = require("./image"); - -Object.defineProperty(exports, "Image", { - enumerable: true, - get: function get() { - return _image.Image; - } -}); - -var _spreadsheet = require("./spreadsheet"); - -Object.defineProperty(exports, "SpreadSheet", { - enumerable: true, - get: function get() { - return _spreadsheet.SpreadSheet; - } -}); - -var _carryforward = require("./carryforward"); - -Object.defineProperty(exports, "CarryForward", { - enumerable: true, - get: function get() { - return _carryforward.CarryForward; - } -}); - -var _widget = require("./widget"); - -Object.defineProperty(exports, "Widget", { - enumerable: true, - get: function get() { - return _widget.Widget; - } -}); - -},{"./blockmath":54,"./carryforward":55,"./checkbox":56,"./checklist":57,"./iframe":58,"./image":59,"./inlinemath":61,"./input":62,"./multiplechoice":63,"./radiobutton":64,"./scale":65,"./select":66,"./spreadsheet":67,"./textarea":68,"./textfield":69,"./widget":70}],61:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var _gitProsemirrorDistModel = require("../../../../git/prosemirror/dist/model"); - -var _gitProsemirrorDistDom = require("../../../../git/prosemirror/dist/dom"); - -var _utils = require("../utils"); - -var InlineMath = (function (_Inline) { - _inherits(InlineMath, _Inline); - - function InlineMath() { - _classCallCheck(this, InlineMath); - - _get(Object.getPrototypeOf(InlineMath.prototype), "constructor", this).apply(this, arguments); - } - - return InlineMath; -})(_gitProsemirrorDistModel.Inline); - -exports.InlineMath = InlineMath; - -InlineMath.attributes = { - tex: new _gitProsemirrorDistModel.Attribute({ "default": "" }) -}; - -(0, _utils.defParser)(InlineMath, "span", "widgets-inlinemath"); - -InlineMath.prototype.serializeDOM = function (node) { - if (node.rendered) { - node.rendered = node.rendered.cloneNode(true); - } else { - node.rendered = (0, _gitProsemirrorDistDom.elt)("span", { "class": "widgets-inlinemath" }, " \\(" + node.attrs.tex + "\\) "); - // wait until node is attached to document to render - MathJax.Hub.Queue(["Delay", MathJax.Callback, 100], ["Typeset", MathJax.Hub, node.rendered]); - } - return node.rendered; -}; - -InlineMath.register("command", { - name: "insertInlineMath", - label: "InlineMath", - run: function run(pm, tex) { - return pm.tr.replaceSelection(this.create({ tex: tex })).apply(_utils.andScroll); - }, - params: [{ label: "Latex Expression", type: "text" }], - prefillParams: function prefillParams(pm) { - var node = pm.selection.node; - - if (node) return [node.attrs.tex]; - } -}); - -(0, _utils.defParamsClick)(InlineMath); - -(0, _gitProsemirrorDistDom.insertCSS)("\n\n.widgets-inlinemath {}\n\n"); - -},{"../../../../git/prosemirror/dist/dom":1,"../../../../git/prosemirror/dist/model":27,"../utils":53}],62:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var _gitProsemirrorDistModel = require("../../../../git/prosemirror/dist/model"); - -var _gitProsemirrorDistDom = require("../../../../git/prosemirror/dist/dom"); - -var _utils = require("../utils"); - -var Input = (function (_Inline) { - _inherits(Input, _Inline); - - function Input() { - _classCallCheck(this, Input); - - _get(Object.getPrototypeOf(Input.prototype), "constructor", this).apply(this, arguments); - } - - return Input; -})(_gitProsemirrorDistModel.Inline); - -exports.Input = Input; - -Input.attributes = { - name: new _gitProsemirrorDistModel.Attribute(), - type: new _gitProsemirrorDistModel.Attribute({ "default": "text" }), - value: new _gitProsemirrorDistModel.Attribute() -}; - -(0, _utils.defParser)(Input, "widgets-input"); - -Input.prototype.serializeDOM = function (node, s) { - return s.renderAs(node, "input", node.attrs); -}; - -(0, _gitProsemirrorDistDom.insertCSS)("\n\t\t\n.widgets-input {}\n\n"); - -},{"../../../../git/prosemirror/dist/dom":1,"../../../../git/prosemirror/dist/model":27,"../utils":53}],63:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - -var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var _gitProsemirrorDistModel = require("../../../../git/prosemirror/dist/model"); - -var _gitProsemirrorDistDom = require("../../../../git/prosemirror/dist/dom"); - -var _utils = require("../utils"); - -var Choice = (function (_Paragraph) { - _inherits(Choice, _Paragraph); - - function Choice() { - _classCallCheck(this, Choice); - - _get(Object.getPrototypeOf(Choice.prototype), "constructor", this).apply(this, arguments); - } - - _createClass(Choice, [{ - key: "create", - value: function create(attrs, content, marks) { - if (attrs.value > 0) content = [this.schema.node("radiobutton", attrs)]; - return _get(Object.getPrototypeOf(Choice.prototype), "create", this).call(this, attrs, content, marks); - } - }], [{ - key: "kind", - get: function get() { - return "."; - } - }]); - - return Choice; -})(_gitProsemirrorDistModel.Paragraph); - -exports.Choice = Choice; - -Choice.attributes = { - name: new _gitProsemirrorDistModel.Attribute(), - value: new _gitProsemirrorDistModel.Attribute() -}; - -var MultipleChoice = (function (_Block) { - _inherits(MultipleChoice, _Block); - - function MultipleChoice() { - _classCallCheck(this, MultipleChoice); - - _get(Object.getPrototypeOf(MultipleChoice.prototype), "constructor", this).apply(this, arguments); - } - - _createClass(MultipleChoice, null, [{ - key: "contains", - get: function get() { - return "choice"; - } - }]); - - return MultipleChoice; -})(_gitProsemirrorDistModel.Block); - -exports.MultipleChoice = MultipleChoice; - -MultipleChoice.attributes = { - name: new _gitProsemirrorDistModel.Attribute() -}; - -(0, _utils.defParser)(Choice, "p", "widgets-choice"); -(0, _utils.defParser)(MultipleChoice, "div", "widgets-multiplechoice"); - -Choice.prototype.serializeDOM = function (node, s) { - return s.renderAs(node, "p", { name: node.attrs.name, value: node.attrs.value, "class": "widgets-choice" }); -}; - -MultipleChoice.prototype.serializeDOM = function (node, s) { - return s.renderAs(node, "div", { name: node.attrs.name, "class": "widgets-multiplechoice" }); -}; - -Choice.register("command", { - name: "splitChoice", - label: "Split the current choice", - run: function run(pm) { - var _pm$selection = pm.selection; - var node = _pm$selection.node; - var from = _pm$selection.from; - var to = _pm$selection.to; - - if (node && node.isBlock || from.path.length < 2 || !_gitProsemirrorDistModel.Pos.samePath(from.path, to.path)) return false; - var toParent = from.shorten(), - grandParent = pm.doc.path(toParent.path); - if (grandParent.type.name != "multiplechoice") return false; - return pm.tr["delete"](from, to).split(from, 1, pm.schema.nodes.choice, { name: grandParent.attrs.name, value: grandParent.size }).apply(_utils.andScroll); - }, - key: "Enter(50)" -}); - -Choice.register("command", { - name: "deleteChoice", - label: "delete this choice or multiplechoice", - run: function run(pm) { - var _pm$selection2 = pm.selection; - var head = _pm$selection2.head; - var empty = _pm$selection2.empty; - - if (!empty || head.offset > 1) return false; - // Find the node before this one - var before = undefined, - cut = undefined; - for (var i = head.path.length - 1; !before && i >= 0; i--) { - if (head.path[i] > 0) { - cut = head.shorten(i); - before = pm.doc.path(cut.path).child(cut.offset - 1); - } - }var mc = pm.doc.path(cut.path).child(cut.offset); - // if top choice, delete whole question if only one choice - if (mc.type.name == "choice") { - return pm.tr["delete"](cut, cut.move(1)).apply(); - } else { - // don't delete question if more than one choice - if (mc.size == 1) { - return pm.tr["delete"](cut, cut.move(1)).apply(); - } else return false; - } - }, - key: ["Backspace(50)", "Mod-Backspace(50)"] -}); - -MultipleChoice.register("command", { - name: "insertMultipleChoice", - label: "MultipleChoice", - run: function run(pm, name) { - var from = pm.selection.from; - - var choice = pm.schema.node("choice", { name: name, value: 0 }); - pm.tr.replaceSelection(this.create({ name: name }, choice)).apply(_utils.andScroll); - //find path of next sibling - /* let len = from.path.length-1 - let sib = from.path[len] - let pfrom = from.path.splice(0,len).concat(sib+1) - pm.setTextSelection(from) - */ - return true; - }, - select: function select(pm) { - console.log("select"); - return pm.doc.path(pm.selection.from.path).type.canContainType(this); - }, - params: [{ label: "Name", type: "text" }], - prefillParams: function prefillParams(pm) { - var node = pm.selection.node; - - if (node) return [node.attrs.name]; - } -}); - -(0, _gitProsemirrorDistDom.insertCSS)("\n\n.widgets-choice {}\n.widgets-multiplechoice {}\n\n"); - -},{"../../../../git/prosemirror/dist/dom":1,"../../../../git/prosemirror/dist/model":27,"../utils":53}],64:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var _gitProsemirrorDistModel = require("../../../../git/prosemirror/dist/model"); - -var _gitProsemirrorDistDom = require("../../../../git/prosemirror/dist/dom"); - -var _utils = require("../utils"); - -var _input = require("./input"); - -var RadioButton = (function (_Input) { - _inherits(RadioButton, _Input); - - function RadioButton() { - _classCallCheck(this, RadioButton); - - _get(Object.getPrototypeOf(RadioButton.prototype), "constructor", this).apply(this, arguments); - } - - return RadioButton; -})(_input.Input); - -exports.RadioButton = RadioButton; - -RadioButton.attributes = { - name: new _gitProsemirrorDistModel.Attribute(), - type: new _gitProsemirrorDistModel.Attribute({ "default": "radio" }), - value: new _gitProsemirrorDistModel.Attribute(), - "class": new _gitProsemirrorDistModel.Attribute({ "default": "widgets-radiobutton" }) -}; - -(0, _utils.defParser)(RadioButton, "input", "widgets-radiobutton"); - -// inherits serializer from input - -(0, _gitProsemirrorDistDom.insertCSS)("\n\n.widgets-radiobutton {}\n\n"); - -},{"../../../../git/prosemirror/dist/dom":1,"../../../../git/prosemirror/dist/model":27,"../utils":53,"./input":62}],65:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var _gitProsemirrorDistModel = require("../../../../git/prosemirror/dist/model"); - -var _gitProsemirrorDistDom = require("../../../../git/prosemirror/dist/dom"); - -var _utils = require("../utils"); - -var Scale = (function (_Block) { - _inherits(Scale, _Block); - - function Scale() { - _classCallCheck(this, Scale); - - _get(Object.getPrototypeOf(Scale.prototype), "constructor", this).apply(this, arguments); - } - - return Scale; -})(_gitProsemirrorDistModel.Block); - -exports.Scale = Scale; - -Scale.attributes = { - name: new _gitProsemirrorDistModel.Attribute(), - startvalue: new _gitProsemirrorDistModel.Attribute({ "default": "1" }), - startlabel: new _gitProsemirrorDistModel.Attribute({ "default": "low" }), - endvalue: new _gitProsemirrorDistModel.Attribute({ "default": "10" }), - endlabel: new _gitProsemirrorDistModel.Attribute({ "default": "high" }) -}; - -(0, _utils.defParser)(Scale, "div", "scale"); - -Scale.prototype.serializeDOM = function (node) { - var dom = (0, _gitProsemirrorDistDom.elt)("div", { "class": "widgets-scale" }); - dom.appendChild((0, _gitProsemirrorDistDom.elt)("span", null, node.attrs.startlabel + " ")); - var startVal = Number(node.attrs.startvalue); - var endVal = Number(node.attrs.endvalue); - if (startVal < endVal) for (var i = startVal; i <= endVal; i++) { - dom.appendChild((0, _gitProsemirrorDistDom.elt)("span", { "class": "widgets-scaleitem" }, (0, _gitProsemirrorDistDom.elt)("input", { name: node.attrs.name, type: "radio", value: i }), i.toString())); - } else for (var i = startVal; i >= endVal; i--) { - dom.appendChild((0, _gitProsemirrorDistDom.elt)("span", { "class": "widgets-scaleitem" }, (0, _gitProsemirrorDistDom.elt)("input", { name: node.attrs.name, type: "radio", value: i }), i.toString())); - } - dom.appendChild((0, _gitProsemirrorDistDom.elt)("span", null, " " + node.attrs.endlabel)); - return dom; -}; - -Scale.register("command", { - name: "insertScale", - label: "Scale", - run: function run(pm, name, startvalue, startlabel, endvalue, endlabel) { - return pm.tr.replaceSelection(this.create({ name: name, startvalue: startvalue, startlabel: startlabel, endvalue: endvalue, endlabel: endlabel })).apply(_utils.andScroll); - }, - params: [{ label: "Name", type: "text" }, { label: "Start value", type: "text", "default": 1 }, { label: "Start label", type: "text", "default": "min" }, { label: "End value", type: "text", "default": 10 }, { label: "End label", type: "text", "default": "max" }], - prefillParams: function prefillParams(pm) { - var node = pm.selection.node; - - if (node) return [node.attrs.name, node.attrs.startvalue, node.attrs.startlabel, node.attrs.endvalue, node.attrs.endlabel]; - } -}); - -(0, _utils.defParamsClick)(Scale); - -(0, _gitProsemirrorDistDom.insertCSS)("\n\n.widgets-scaleitem {}\t\t\n.widgets-scale {}\n\n"); - -},{"../../../../git/prosemirror/dist/dom":1,"../../../../git/prosemirror/dist/model":27,"../utils":53}],66:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var _gitProsemirrorDistModel = require("../../../../git/prosemirror/dist/model"); - -var _gitProsemirrorDistDom = require("../../../../git/prosemirror/dist/dom"); - -var _utils = require("../utils"); - -var Select = (function (_Inline) { - _inherits(Select, _Inline); - - function Select() { - _classCallCheck(this, Select); - - _get(Object.getPrototypeOf(Select.prototype), "constructor", this).apply(this, arguments); - } - - return Select; -})(_gitProsemirrorDistModel.Inline); - -exports.Select = Select; - -Select.attributes = { - name: new _gitProsemirrorDistModel.Attribute(), - options: new _gitProsemirrorDistModel.Attribute(), - multiple: new _gitProsemirrorDistModel.Attribute({ "default": "single" }) -}; - -(0, _utils.defParser)(Select, "select", "widgets-select"); - -Select.prototype.serializeDOM = function (node) { - var selection = node.attrs.multiple == "multiple"; - var select = (0, _gitProsemirrorDistDom.elt)("select", { name: node.attrs.name, "class": "widgets-select", size: 1, multiple: selection }); - node.attrs.options.split(",").map(function (option) { - select.appendChild((0, _gitProsemirrorDistDom.elt)("option", { value: option.trim() }, option)); - }); - return select; -}; - -Select.register("command", { - name: "insertSelect", - label: "Select", - run: function run(pm, name, options, multiple) { - return pm.tr.replaceSelection(this.create({ name: name, options: options, multiple: multiple })).apply(_utils.andScroll); - }, - params: [{ label: "Name", type: "text" }, { label: "Options (comma separated)", type: "text" }, { label: "Selection (single or multiple)", type: "select", options: [{ value: "multiple", label: "multiple" }, { value: "single", label: "single" }] }], - prefillParams: function prefillParams(pm) { - var node = pm.selection.node; - - if (node) { - return [node.attrs.name, node.attrs.options, node.attrs.multiple]; - } - } -}); - -(0, _utils.defParamsClick)(Select); - -(0, _gitProsemirrorDistDom.insertCSS)("\n\n.widgets-select {}\n\n"); - -},{"../../../../git/prosemirror/dist/dom":1,"../../../../git/prosemirror/dist/model":27,"../utils":53}],67:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var _gitProsemirrorDistModel = require("../../../../git/prosemirror/dist/model"); - -var _gitProsemirrorDistDom = require("../../../../git/prosemirror/dist/dom"); - -var _utils = require("../utils"); - -var SpreadSheet = (function (_Block) { - _inherits(SpreadSheet, _Block); - - function SpreadSheet() { - _classCallCheck(this, SpreadSheet); - - _get(Object.getPrototypeOf(SpreadSheet.prototype), "constructor", this).apply(this, arguments); - } - - return SpreadSheet; -})(_gitProsemirrorDistModel.Block); - -exports.SpreadSheet = SpreadSheet; - -SpreadSheet.attributes = { - data: new _gitProsemirrorDistModel.Attribute({ "default": "" }) -}; - -(0, _utils.defParser)(SpreadSheet, "div", "widgets-spreadsheet"); - -SpreadSheet.prototype.serializeDOM = function (node) { - if (node.rendered) { - node.rendered = node.rendered.cloneNode(true); - } else { - node.rendered = (0, _gitProsemirrorDistDom.elt)("div", { - id: "spreadsheet", - "class": "widgets-spreadsheet" - }); - // wait until node is attached to document to render - window.setTimeout(function () { - var data = [["", "Ford", "Volvo", "Toyota", "Honda"], ["2014", 10, 11, 12, 13], ["2015", 20, 11, 14, 13], ["2016", 30, 15, 12, 13]]; - - var container = document.getElementById('spreadsheet'); - var hot = new Handsontable(container, { - data: data, - minSpareRows: 1, - rowHeaders: true, - colHeaders: true, - contextMenu: true - }); - }, 100); - } - return node.rendered; -}; - -SpreadSheet.register("command", { - name: "insertSpreadSheet", - label: "SpreadSheet", - run: function run(pm, data) { - return pm.tr.replaceSelection(this.create({ data: data })).apply(_utils.andScroll); - }, - params: [{ label: "Link to data csv (fixed for demo)", type: "text", "default": "cars.csv" }], - prefillParams: function prefillParams(pm) { - var node = pm.selection.node; - - if (node) return [node.attrs.data]; - } -}); - -(0, _utils.defParamsClick)(SpreadSheet); - -(0, _gitProsemirrorDistDom.insertCSS)("\n\n.widgets-spreadsheet {}\n\n"); - -},{"../../../../git/prosemirror/dist/dom":1,"../../../../git/prosemirror/dist/model":27,"../utils":53}],68:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var _gitProsemirrorDistModel = require("../../../../git/prosemirror/dist/model"); - -var _gitProsemirrorDistDom = require("../../../../git/prosemirror/dist/dom"); - -var _utils = require("../utils"); - -var TextArea = (function (_Block) { - _inherits(TextArea, _Block); - - function TextArea() { - _classCallCheck(this, TextArea); - - _get(Object.getPrototypeOf(TextArea.prototype), "constructor", this).apply(this, arguments); - } - - return TextArea; -})(_gitProsemirrorDistModel.Block); - -exports.TextArea = TextArea; - -TextArea.attributes = { - name: new _gitProsemirrorDistModel.Attribute(), - rows: new _gitProsemirrorDistModel.Attribute(), - cols: new _gitProsemirrorDistModel.Attribute(), - "class": new _gitProsemirrorDistModel.Attribute({ "default": "widgets-textarea" }) -}; - -(0, _utils.defParser)(TextArea, "input", "widgets-textarea"); - -TextArea.prototype.serializeDOM = function (node, s) { - return s.renderAs(node, "textarea", node.attrs); -}; - -TextArea.register("command", { - name: "insertTextArea", - label: "TextArea", - run: function run(pm, name, rows, cols) { - return pm.tr.replaceSelection(this.create({ name: name, rows: rows, cols: cols })).apply(_utils.andScroll); - }, - params: [{ label: "Name", type: "text" }, { label: "Rows", type: "text", "default": "4" }, { label: "Columns", type: "text", "default": "20" }], - prefillParams: function prefillParams(pm) { - var node = pm.selection.node; - - if (node) return [node.attrs.name, node.attrs.rows, node.attrs.cols]; - } -}); - -(0, _utils.defParamsClick)(TextArea); - -(0, _gitProsemirrorDistDom.insertCSS)("\n\n.widgets-textarea {}\n\n"); - -},{"../../../../git/prosemirror/dist/dom":1,"../../../../git/prosemirror/dist/model":27,"../utils":53}],69:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var _gitProsemirrorDistModel = require("../../../../git/prosemirror/dist/model"); - -var _gitProsemirrorDistDom = require("../../../../git/prosemirror/dist/dom"); - -var _input = require("./input"); - -var _utils = require("../utils"); - -var TextField = (function (_Input) { - _inherits(TextField, _Input); - - function TextField() { - _classCallCheck(this, TextField); - - _get(Object.getPrototypeOf(TextField.prototype), "constructor", this).apply(this, arguments); - } - - return TextField; -})(_input.Input); - -exports.TextField = TextField; - -TextField.attributes = { - name: new _gitProsemirrorDistModel.Attribute(), - type: new _gitProsemirrorDistModel.Attribute({ "default": "text" }), - size: new _gitProsemirrorDistModel.Attribute({ "default": "20" }), - "class": new _gitProsemirrorDistModel.Attribute({ "default": "widgets-textfield" }) -}; - -(0, _utils.defParser)(TextField, "input", "widgets-textfield"); - -// serializer inherits from input - -TextField.register("command", { - name: "insertTextField", - label: "TextField", - run: function run(pm, name, size) { - return pm.tr.replaceSelection(this.create({ name: name, size: size })).apply(_utils.andScroll); - }, - params: [{ label: "Name", type: "text" }, { label: "Size", type: "text", "default": "20" }], - prefillParams: function prefillParams(pm) { - var node = pm.selection.node; - - if (node) return [node.attrs.name, node.attrs.size]; - } -}); - -(0, _utils.defParamsClick)(TextField); - -(0, _gitProsemirrorDistDom.insertCSS)("\n\n.widgets-textfield {}\n\n"); - -},{"../../../../git/prosemirror/dist/dom":1,"../../../../git/prosemirror/dist/model":27,"../utils":53,"./input":62}],70:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var _gitProsemirrorDistMenuMenu = require("../../../../git/prosemirror/dist/menu/menu"); - -var _gitProsemirrorDistModel = require("../../../../git/prosemirror/dist/model"); - -var _gitProsemirrorDistDom = require("../../../../git/prosemirror/dist/dom"); - -var widgets = ["Image", "TextField", "TextArea", "CheckBox", "Select", "CarryForward", "IFrame", "InlineMath", "BlockMath", "SpreadSheet", "MultipleChoice", "Scale", "CheckList"]; - -var insertWidget = widgets.map(function (w) { - return { - value: "insert" + w, - display: function display() { - return (0, _gitProsemirrorDistDom.elt)("span", null, w); - } - }; -}); - -var Widget = (function (_Textblock) { - _inherits(Widget, _Textblock); - - function Widget() { - _classCallCheck(this, Widget); - - _get(Object.getPrototypeOf(Widget.prototype), "constructor", this).apply(this, arguments); - } - - return Widget; -})(_gitProsemirrorDistModel.Textblock); - -exports.Widget = Widget; - -Widget.register("command", { - name: "insertWidget", - label: "Insert...", - select: function select(pm) { - return true; - }, - params: [{ name: "Widget type", type: "select", options: insertWidget, defaultLabel: "Insert..." }], - run: function run(pm, type) { - var menu = pm.mod.menuBar.menu; - var cmd = pm.commands[type]; - if (menu && cmd) menu.enter((0, _gitProsemirrorDistMenuMenu.readParams)(cmd)); - }, - display: "select", - menuGroup: "block", - menuRank: 99 -}); - -},{"../../../../git/prosemirror/dist/dom":1,"../../../../git/prosemirror/dist/menu/menu":19,"../../../../git/prosemirror/dist/model":27}]},{},[52]) -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy93YXRjaGlmeS9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvYnJvd3Nlci1wYWNrL19wcmVsdWRlLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9kb20vaW5kZXguanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L2VkaXQvY2FwdHVyZWtleXMuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L2VkaXQvY2hhci5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZWRpdC9jb21tYW5kcy5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZWRpdC9jc3MuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L2VkaXQvZG9tY2hhbmdlLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9lZGl0L2RyYXcuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L2VkaXQvaGlzdG9yeS5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZWRpdC9pbmRleC5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZWRpdC9pbnB1dC5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZWRpdC9rZXlzLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9lZGl0L21haW4uanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L2VkaXQvb3B0aW9ucy5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZWRpdC9yYW5nZS5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZWRpdC9zZWxlY3Rpb24uanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L2lucHV0cnVsZXMvYXV0b2lucHV0LmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9pbnB1dHJ1bGVzL2lucHV0cnVsZXMuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L21lbnUvaWNvbnMuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L21lbnUvbWVudS5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvbWVudS9tZW51YmFyLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9tZW51L3Rvb2x0aXAuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L21lbnUvdG9vbHRpcG1lbnUuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L21lbnUvdXBkYXRlLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9tb2RlbC9kZWZhdWx0c2NoZW1hLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9tb2RlbC9kaWZmLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9tb2RlbC9mcmFnbWVudC5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvbW9kZWwvaW5kZXguanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L21vZGVsL21hcmsuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L21vZGVsL25vZGUuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L21vZGVsL3Bvcy5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvbW9kZWwvc2NoZW1hLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9wYXJzZS9kb20uanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L3BhcnNlL2luZGV4LmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9wYXJzZS90ZXh0LmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9zZXJpYWxpemUvZG9tLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9zZXJpYWxpemUvaW5kZXguanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L3NlcmlhbGl6ZS90ZXh0LmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC90cmFuc2Zvcm0vYW5jZXN0b3IuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L3RyYW5zZm9ybS9pbmRleC5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvdHJhbnNmb3JtL2pvaW4uanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L3RyYW5zZm9ybS9tYXAuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L3RyYW5zZm9ybS9tYXJrLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC90cmFuc2Zvcm0vcmVwbGFjZS5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvdHJhbnNmb3JtL3NwbGl0LmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC90cmFuc2Zvcm0vc3RlcC5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvdHJhbnNmb3JtL3RyYW5zZm9ybS5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvdHJhbnNmb3JtL3RyZWUuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L3V0aWwvZXJyb3IuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L3V0aWwvZXZlbnQuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L3V0aWwvbWFwLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC91dGlsL3NvcnRlZGluc2VydC5qcyIsImM6L1VzZXJzL3Bib3lzZW4vcHJvc2VtaXJyb3IvcHJvc2VtaXJyb3Itd2lkZ2V0cy9zcmMvbWFpbi5qcyIsImM6L1VzZXJzL3Bib3lzZW4vcHJvc2VtaXJyb3IvcHJvc2VtaXJyb3Itd2lkZ2V0cy9zcmMvdXRpbHMvaW5kZXguanMiLCJjOi9Vc2Vycy9wYm95c2VuL3Byb3NlbWlycm9yL3Byb3NlbWlycm9yLXdpZGdldHMvc3JjL3dpZGdldHMvYmxvY2ttYXRoLmpzIiwiYzovVXNlcnMvcGJveXNlbi9wcm9zZW1pcnJvci9wcm9zZW1pcnJvci13aWRnZXRzL3NyYy93aWRnZXRzL2NhcnJ5Zm9yd2FyZC5qcyIsImM6L1VzZXJzL3Bib3lzZW4vcHJvc2VtaXJyb3IvcHJvc2VtaXJyb3Itd2lkZ2V0cy9zcmMvd2lkZ2V0cy9jaGVja2JveC5qcyIsImM6L1VzZXJzL3Bib3lzZW4vcHJvc2VtaXJyb3IvcHJvc2VtaXJyb3Itd2lkZ2V0cy9zcmMvd2lkZ2V0cy9jaGVja2xpc3QuanMiLCJjOi9Vc2Vycy9wYm95c2VuL3Byb3NlbWlycm9yL3Byb3NlbWlycm9yLXdpZGdldHMvc3JjL3dpZGdldHMvaWZyYW1lLmpzIiwiYzovVXNlcnMvcGJveXNlbi9wcm9zZW1pcnJvci9wcm9zZW1pcnJvci13aWRnZXRzL3NyYy93aWRnZXRzL2ltYWdlLmpzIiwiYzovVXNlcnMvcGJveXNlbi9wcm9zZW1pcnJvci9wcm9zZW1pcnJvci13aWRnZXRzL3NyYy93aWRnZXRzL2luZGV4LmpzIiwiYzovVXNlcnMvcGJveXNlbi9wcm9zZW1pcnJvci9wcm9zZW1pcnJvci13aWRnZXRzL3NyYy93aWRnZXRzL2lubGluZW1hdGguanMiLCJjOi9Vc2Vycy9wYm95c2VuL3Byb3NlbWlycm9yL3Byb3NlbWlycm9yLXdpZGdldHMvc3JjL3dpZGdldHMvaW5wdXQuanMiLCJjOi9Vc2Vycy9wYm95c2VuL3Byb3NlbWlycm9yL3Byb3NlbWlycm9yLXdpZGdldHMvc3JjL3dpZGdldHMvbXVsdGlwbGVjaG9pY2UuanMiLCJjOi9Vc2Vycy9wYm95c2VuL3Byb3NlbWlycm9yL3Byb3NlbWlycm9yLXdpZGdldHMvc3JjL3dpZGdldHMvcmFkaW9idXR0b24uanMiLCJjOi9Vc2Vycy9wYm95c2VuL3Byb3NlbWlycm9yL3Byb3NlbWlycm9yLXdpZGdldHMvc3JjL3dpZGdldHMvc2NhbGUuanMiLCJjOi9Vc2Vycy9wYm95c2VuL3Byb3NlbWlycm9yL3Byb3NlbWlycm9yLXdpZGdldHMvc3JjL3dpZGdldHMvc2VsZWN0LmpzIiwiYzovVXNlcnMvcGJveXNlbi9wcm9zZW1pcnJvci9wcm9zZW1pcnJvci13aWRnZXRzL3NyYy93aWRnZXRzL3NwcmVhZHNoZWV0LmpzIiwiYzovVXNlcnMvcGJveXNlbi9wcm9zZW1pcnJvci9wcm9zZW1pcnJvci13aWRnZXRzL3NyYy93aWRnZXRzL3RleHRhcmVhLmpzIiwiYzovVXNlcnMvcGJveXNlbi9wcm9zZW1pcnJvci9wcm9zZW1pcnJvci13aWRnZXRzL3NyYy93aWRnZXRzL3RleHRmaWVsZC5qcyIsImM6L1VzZXJzL3Bib3lzZW4vcHJvc2VtaXJyb3IvcHJvc2VtaXJyb3Itd2lkZ2V0cy9zcmMvd2lkZ2V0cy93aWRnZXQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQSxZQUFZLENBQUM7O0FBRWIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFO0FBQzND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RSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFBLENBQUUsSUFBSSxDQUFBLEFBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFO0FBQUUsWUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQUFBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxNQUFNO09BQUU7S0FBRSxDQUFDLE9BQU8sR0FBRyxFQUFFO0FBQUUsUUFBRSxHQUFHLElBQUksQ0FBQyxBQUFDLEVBQUUsR0FBRyxHQUFHLENBQUM7S0FBRSxTQUFTO0FBQUUsVUFBSTtBQUFFLFlBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO09BQUUsU0FBUztBQUFFLFlBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDO09BQUU7S0FBRSxBQUFDLE9BQU8sSUFBSSxDQUFDO0dBQUUsQUFBQyxPQUFPLFVBQVUsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUFFLFFBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUFFLGFBQU8sR0FBRyxDQUFDO0tBQUUsTUFBTSxJQUFJLE1BQU0sQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFO0FBQUUsYUFBTyxhQUFhLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQUUsTUFBTTtBQUFFLFlBQU0sSUFBSSxTQUFTLENBQUMsc0RBQXNELENBQUMsQ0FBQztLQUFFO0dBQUUsQ0FBQztDQUFFLENBQUEsRUFBRyxDQUFDOztBQUUxcEIsSUFBSSxZQUFZLEdBQUcsQ0FBQyxZQUFZO0FBQUUsV0FBUyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFO0FBQUUsU0FBSyxJ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QU0sSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRSxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7QUFDNUcsV0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLEVBQUUsQ0FBQztHQUNsRTs7QUFFRCxNQUFJLFVBQVUsR0FBRyxJQUFJO01BQ2pCLFNBQVMsR0FBRyxJQUFJLENBQUM7QUFDckIsTUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMxRSxTQUFPLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7QUFDbkQsTUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLFFBQVEsSUFBSSxDQUFDLEVBQUU7QUFDbEMsUUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztBQUM3QixjQUFVLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztBQUMxQixRQUFJLElBQUksSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxVQUFVLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQztHQUN4RjtBQUNELE1BQUksS0FBSyxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM5RCxTQUFPLEtBQUssQ0FBQyxVQUFVLEVBQUUsS0FBSyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7QUFDbEQsTUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLFFBQVEsSUFBSSxDQUFD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RUFBRSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsS0FBSztBQUM1RixJQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsUUFBUTtBQUN4RixJQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUs7QUFDL0QsS0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxRQUFRO0FBQy9ELEtBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJO0FBQ25HLEtBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRO0FBQzlGLE9BQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFFBQVE7Q0FDakYsQ0FBQzs7QUFFRixPQUFPLENBQUMsUUFBUSxHQUFHLFFB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QixRQUFJLElBQUksQ0FBQyxHQUFHLElBQUksSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O0FBR2hHLFFBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQSxDQUFFLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxDQUFDLENBQUM7OztBQUd4RSxRQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUEsQ0FBRSxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzlFLFFBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzs7QUFFaEMsUUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzs7QUFFN0gsUUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUEsQ0FBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMzRyxLQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFBLENBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFH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QUUsR0FBRyxVQUFVLENBQUMsRUFBRSxDQUFDO0FBQ3ZCLFVBQUksT0FBTyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxNQUFNLEdBQUcsU0FBUyxDQUFDO0FBQ3JELFVBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksWUFBWSxLQUFLLEtBQUssRUFBRTtBQUNuRCxZQUFJLEtBQUssR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3ZFLFlBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7T0FDdkQ7O0FBRUQsVUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLFdBQVcsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTs7QUFFM0QsWUFBSSxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDeEMsVUFBRSxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztPQUM5QyxNQUFNLElBQUksT0FBTyxFQUFFOztBQUVsQixlQUFPLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLEtBQUssTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQSxBQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLEVBQUUsSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMs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LE9BQU8sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDO09BQ3RIO0tBQ0Y7R0FDRixDQUFDLENBQUMsQ0FBQzs7QUFFSixTQUFPLFlBQVksQ0FBQztDQUNyQixDQUFBLEVBQUcsQ0FBQzs7O0FDeE1MLFlBQVksQ0FBQzs7QUFFYixNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUU7QUFDM0MsT0FBSyxFQUFFLElBQUk7Q0FDWixDQUFDLENBQUM7O0FBRUgsSUFBSSxJQUFJLEdBQUcsU0FBUyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFBRSxNQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsQUFBQyxTQUFTLEVBQUUsT0FBTyxNQUFNLEVBQUU7QUFBRSxRQUFJLE1BQU0sR0FBRyxFQUFFO1FBQUUsUUFBUSxHQUFHLEdBQUc7UUFBRSxRQUFRLEdBQUcsR0FBRyxDQUFDLEFBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxBQUFDLElBQUksTUFBTSxLQUFLLElBQUksRUFBRSxNQUFNLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxBQUFDLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsQUFBQyxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7QUFBRSxVQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEFBQUMsSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFO0FBQUUsZUFBTyxTQUFTLENBQUM7T0FBRSxNQUFNO0FBQUUsVUFBRSxHQUFHLE1BQU0sQ0FBQyxBQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsQUFBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLEFBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxBQUFDLElBQUksR0FBRyxNQUFNLEdBQUcsU0FBUyxDQUFDLEFBQUMsU0FBUyxTQUFTLENBQUM7T0FBRTtLQUFFLE1BQU0sSUFBSSxPQUFPLElBQUksSUFBSSxFQUFFO0FBQUUsYUFBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0tBQUUsTUFBTTtBQUFFLFVBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQUFBQyxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUU7QUFBRSxlQUFPLFNBQVMsQ0FBQztPQUFFLEFBQUMsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBQUU7R0FBRTtDQUFFLENBQUM7O0FBRWxwQixJQUFJLFlBQVksR0FBRyxDQUFDLFlBQVk7QUFBRSxXQUFTLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUU7QUFBRSxTQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUFFLFVBQUksVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxBQUFDLFVBQVUsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsQUFBQyxVQUFVLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxBQUFDLElBQUksT0FBTyxJQUFJLFVBQVUsRUFBRSxVQUFVLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxBQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7S0FBRTtHQUFFLEFBQUMsT0FBTyxVQUFVLFdBQVcsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFO0FBQUUsUUFBSSxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQyxBQUFDLElBQUksV0FBVyxFQUFFLGdCQUFnQixDQUFD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RyxDQUFDLENBQUM7QUFDZixPQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNyQyxRQUFJLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEIsUUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUztBQUMvQyxRQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7QUFDN0UsUUFBSSxFQUFFLEdBQUcsSUFBSSxFQUFFLFNBQVM7QUFDeEIsUUFBSSxFQUFFLEdBQUcsSUFBSSxFQUFFO0FBQ2IsVUFBSSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO0tBQ3RCO0FBQ0QsUUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQzdFLFFBQUksRUFBRSxHQUFHLElBQUksRUFBRTtBQUNiLFVBQUksR0FBRyxFQUFFLENBQUM7QUFDVixZQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFBLEdBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQ3ZEO0dBQ0Y7QUFDRCxNQUFJLE1BQU0sS0FBSyxJQUFJLElBQUksSUFBSSxDQUFBLEFBQUMsRUFBRSxPQUFPLElBQUksQ0FBQztBQUMxQyxTQUFPLE1BQU0sQ0FBQztDQUNmOztBQUVELFNBQVMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUU7QUFDOUMsTUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7QUFDaEMsTUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQ25DLE1BQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztBQUNmLE9BQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDNUIsU0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzFCLFNBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLFNBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQztHQUMzQztBQUNELFNBQU8sYUFBYSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7Q0FDN0M7O0FBRUQsU0FBUyxlQUFlLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRTtBQUN4QyxNQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7QUFDZixPQUFLLElBQUksS0FBSyxHQUFHLE9BQU8sQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLEtBQUssR0FBRyxLQUFLLENBQUMsV0FBVyxFQUFFO0FBQ3JFLFFBQUksS0FBSyxDQUFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7R0FDbEc7QUFDRCxTQUFPLGFBQWEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7Q0FDckM7O0FBRUQsU0FBUyxlQUFlLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRTtBQUNyRCxNQUFJLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzFCLE1BQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxPQUFPLElBQUksYUFBYSxDQUFDLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQzs7QUFFN0UsT0FBSyxJQUFJLENBQUMsR0FBRyxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUEsQUFBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksR0FBRyxFQUFFO0FBQ3BGLFFBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUIsUUFBSSxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxJQUFJLGFBQWEsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3pKLFFBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDYixRQUFJLE1BQU0sR0FBRyxlQUFlLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUM3RSxRQUFJLE1BQU0sRUFBRSxPQUFPLE1BQU0sQ0FBQztBQUMxQixRQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7R0FDWjtDQUNGOzs7O0FBSUQsU0FBUyxpQkFB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QUFJLE1BQU0sR0FBRyxFQUFFO1FBQUUsUUFBUSxHQUFHLEdBQUc7UUFBRSxRQUFRLEdBQUcsR0FBRyxDQUFDLEFBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxBQUFDLElBQUksTUFBTSxLQUFLLElBQUksRUFBRSxNQUFNLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxBQUFDLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsQUFBQyxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7QUFBRSxVQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEFBQUMsSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFO0FBQUUsZUFBTyxTQUFTLENBQUM7T0FBRSxNQUFNO0FBQUUsVUFBRSxHQUFHLE1BQU0sQ0FBQyxBQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsQUFBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLEFBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxBQUFDLElBQUksR0FBRyxNQUFNLEdBQUcsU0FBUyxDQUFDLEFBQUMsU0FBUyxTQUFTLENBQUM7T0FBRTtLQUFFLE1BQU0sSUFBSSxPQUFPLElBQUksSUFBSSxFQUFFO0FBQUUsYUFBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0tBQUUsTUFBTTtBQUFFLFVBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQUFBQyxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUU7QUFBRSxlQUFPLFNBQVMsQ0FBQztPQUFFLEFBQUMsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBQUU7R0FBRTtDQUFFLENBQUM7O0FBRWxwQixTQUFTLGVBQWUsQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFO0FBQUUsTUFBSSxFQUFFLFFBQVEsWUFBWSxXQUFXLENBQUEsQUFBQyxFQUFFO0FBQUUsVUFBTSxJQUFJLFNBQVMsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO0dBQUU7Q0FBRTs7QUFF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M0MsT0FBSyxFQUFFLElBQUk7Q0FDWixDQUFDLENBQUM7O0FBRUgsSUFBSSxJQUFJLEdBQUcsU0FBUyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUU7QUFBRSxNQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsQUFBQyxTQUFTLEVBQUUsT0FBTyxNQUFNLEVBQUU7QUFBRSxRQUFJLE1BQU0sR0FBRyxJQUFJO1FBQUUsUUFBUSxHQUFHLElBQUk7UUFBRSxRQUFRLEdBQUcsSUFBSSxDQUFDLEFBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxBQUFDLElBQUksTUFBTSxLQUFLLElBQUksRUFBRSxNQUFNLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxBQUFDLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsQUFBQyxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7QUFBRSxVQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEFBQUMsSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFO0FBQUUsZUFBTyxTQUFTLENBQUM7T0FBRSxNQUFNO0FBQUUsWUFBSSxHQUFHLE1BQU0sQ0FBQyxBQUFDLElBQUksR0FBRyxRQUFRLENBQUMsQUFBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLEFBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxBQUFDLElBQUksR0FBRyxNQUFNLEdBQUcsU0FBUyxDQUFDLEFBQUMsU0FBUyxTQUFTLENBQUM7T0FBRTtLQUFFLE1BQU0sSUFBSSxPQUFPLElBQUksSUFBSSxFQUFFO0FBQUUsYUFBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0tBQUUsTUFBTTtBQUFFLFVBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQUFBQyxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUU7QUFBRSxlQUFPLFNBQVMsQ0FBQztPQUFFLEFBQUMsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFD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QUNELE9BQUcsRUFBRSxhQUFhO0FBQ2xCLFNBQUssRUFBRSxTQUFTLFdBQVcsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRTtBQUN0RCxVQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDO1VBQzlCLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDMUMsVUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7VUFDM0IsS0FBSyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7QUFDN0IsVUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNwQyxVQUFJLElBQUksSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLElBQUksUUFBUSxHQUFHLENBQUMsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLFFBQVEsR0FBRyxDQUFDLEVBQUUsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUNqUyxhQUFPLFFBQVEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FD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Q2xDLE9BQU8sS0FBSyxDQUFDO0tBQ2Y7Ozs7O0dBS0YsRUFBRTtBQUNELE9BQUcsRUFBRSxJQUFJO0FBQ1QsU0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRTtBQUN4QixVQUFJLElBQUksSUFBSSxLQUFLLEVBQUUsT0FBTyxJQUFJLENBQUM7QUFDL0IsVUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDMUMsV0FBSyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO0FBQzNCLFlBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sS0FBSyxDQUFDO09BQ3pELE9BQU8sSUFBSSxDQUFDO0tBQ2Q7Ozs7R0FJRixDQUFDLEVBQUUsQ0FBQztBQUNILE9BQUcsRUFBRSxTQUFTO0FBQ2QsU0FBSyxFQUFFLFNBQVMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDNUIsVUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQ3hCLFVBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQ3ZDLFdBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ2pDLFlBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sS0FBSyxDQUFDO09BQ2xDLE9BQU8sSUFBSSxDQUFDO0tBQ2Q7Ozs7O0dBS0YsRUFBRTtBQUNELE9BQUcsRUFBRSxTQUFTO0FBQ2QsU0FBSyxFQUFFLFNBQVMsT0FBTyxDQUFDLEtBQUssRUFBRTtBQUM3QixVQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFN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LEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFBLENBQUUsSUFBSSxDQUFBLEFBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFO0FBQUUsWUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQUFBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxNQUFNO09BQUU7S0FBRSxDQUFDLE9BQU8sR0FBRyxFQUFFO0FBQUUsUUFBRSxHQUFHLElBQUksQ0FBQyxBQUFDLEVBQUUsR0FBRyxHQUFHLENBQUM7S0FBRSxTQUFTO0FBQUUsVUFBSTtBQUFFLFlBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO09BQUUsU0FBUztBQUFFLFlBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDO09BQUU7S0FBRSxBQUFDLE9BQU8sSUFBSSxDQUFDO0dBQUUsQUFBQyxPQUFPLFVBQVUsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUFFLFFBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUFFLGFBQU8sR0FBRyxDQUFDO0tBQUUsTUFBTSxJQUFJLE1BQU0sQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFO0FBQUUsYUFBTyxhQUFhLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQUUsTUFBTTtBQUFFLFlBQU0sSUFBSSxTQUFTLENBQUMsc0RBQXNELENBQUMsQ0FBQztLQUFFO0dBQUUsQ0FBQztDQUFFLENBQUEsRUFBRyxDQUFDOztBQUUxcEIsSUFBSSxZQUFZLEdBQUcsQ0FBQyxZQUFZO0FBQUUsV0FBUyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFO0FBQUUsU0FBSyxJQUFJLENB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SSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxJQUFJLENBQUM7QUFDOUksZUFBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDdEQ7QUFDRCxRQUFJLElBQUksR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQzs7QUFFaEQsUUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQy9CLFNBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3JDLGFBQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztLQUM3QixJQUFJLFlBQVksR0FBRyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO0FBQ3RFLFFBQUksUUFBUSxHQUFHLElBQUksQ0FBQztBQUNwQixRQUFJLFlBQVksR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7QUFDOUQsUUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO0FBQzFELFVBQUksU0FBUyxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDaEQsVUFBSSxTQUFTLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUM7VUFDekMsU0FBUyxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsS0FBSyxHQUFHLFlBQVksQ0FBQyxDQUFDO0FBQy9ELFVBQUksVUFBVSxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUEsQUFBQyxDQUFDLENBQUM7QUFDMUYsY0FBUSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFlBQVksQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7S0FDbks7QUFDRCxRQUFJLEtBQUssR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7QUFDL0UsUUFBSSxHQUFHLEdBQUcsS0FBSyxJQUFJLFlBQVksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxFQUFFLFVBQVUsR0FBRyxHQUFHLEVBQUUsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxLQUFLLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xLLFdBQU8sSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7R0FDckU7QUFDRCxRQUFNLEVBQUUsU0FBUyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUU7QUFDekMsUUFBSSxLQUFLLEdBQUcsRUFBRTtRQUNWLEtBQUssR0FB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SyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7Q0FDbEQ7Ozs7OztBQU1ELFVBQVUsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxVQUFVLElBQUksRUFBRTtBQUNwRCxNQUFJLEVBQUUsR0FBRyxTQUFTLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxHQUFHLElBQUksR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkYsU0FBTyxDQUFDLFlBQVk7QUFDbEIsUUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3RDLFFBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxJQUFJLENBQUM7QUFDdEIsUUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQztBQUN0QixRQUFJLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDOztBQUV0QixRQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7QUFDdkQsUUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDOztBQUUvRCxTQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRTtBQUNwQyxVQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRTtBQUM3QyxZQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDM0IsY0FB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LElBQUksQ0FBQztHQUNiLENBQUEsQ0FBRSxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0NBQzNCLENBQUM7Ozs7OztBQU1GLFNBQVMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRTtBQUNwQyxNQUFJLEtBQUssR0FBRyxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksSUFBSSxDQUFDLENBQUM7QUFDL0MsTUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxPQUFPLElBQUksQ0FBQztBQUN0RCxNQUFJLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdkMsTUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDOUMsTUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdkUsTUFBSSxNQUFNLElBQUksTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDO0NBQy9FOzs7Ozs7QUFNRCxVQUFVLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsVUFBVSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUU7QUFDekUsTUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUM1QyxNQUFJLENBQUMsR0FBRyxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQ3RCLE1BQUksS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUM7QUFDdEIsTUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztBQUN4QixNQUFJLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDOztBQUV4QixNQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMvQyxNQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVk7QUFDakMsV0FBTyxJQUFJLENBQUM7R0FDYixDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVk7QUFDakQsV0FBTyxJQUFJLENBQUM7R0FDYixDQUFDLENBQUMsQ0FBQztBQUNKLE1BQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQ2xGLE1BQUksTUFBTSxDQUFDLE1BQU0sRUFBRTtBQUNqQixRQUFJLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUN0QyxTQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUMxRCxhQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUN6QyxLQUFLLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ2pFLFVBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDdkQ7R0FDRjtBQUNELFNBQU8sSUFBSSxDQUFDO0NBQ2IsQ0FBQzs7Ozs7QUFLRixVQUFVLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxZQUFZLEdBQUcsVUFBVSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7QUFDN0UsTUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDOztBQUVqQixNQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLElBQUksRUFBRSxVQUFVLElBQUksRUFBRSxJQUFJLEVBQUU7QUFDNUQsUUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUU7QUFDcEQsVUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7QUFFcEIsV0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ2xGLFdBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLElB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QUksTUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLElBQUksQ0FBQztBQUN4RixTQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzdCLFVBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLElBQUksQ0FBQztLQUNyQyxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN2QyxRQUFJLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUM3QixPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztBQUMxQixRQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQ3BDLFFBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzFDLFFBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzs7QUFFNUcsUUFBSSxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sR0FBRyxNQUFNLEdBQUcsQ0FBQyxFQUFFLElB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LEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0tBQzlIO0dBQ0Y7O0FBRUQsT0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3pDLFFBQUksS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDekIsUUFBSSxLQUFLLEdBQUcsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztBQUM1QyxRQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUMzRyxVQUFJLElBQUksR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO0FBQzNDLFVBQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7QUFDeEIsVUFBSSxHQUFHLENBQUMsS0FBSyxHQUFHLEtBQUssRUFBRTtBQUNyQixZQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQSxBQUFDLENBQUM7QUFDNUQsZUFBTyxJQUFJLFNBQVMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJ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TUFBTSxDQUFDOztBQUVoQyxRQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQzFCLFFBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7O0FBRTVCLFFBQUksT0FBTyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7QUFDekIsUUFBSSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksT0FBTyxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQ2xJLFFBQUksU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pLLFFBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxDQUFDOztBQUVsRCxRQUFJLElBQUksR0FBRyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDNUQsUUFBSSxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxVQUFVLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFD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M0MsYUFBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1dBQzNCO1NBQ0Y7T0FDRjtBQUNELFVBQUksS0FBSyxFQUFFO0FBQ1QsY0FBTSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUM7T0FDcEIsTUFBTTtBQUNMLGNBQU0sR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3hCLGFBQUssSUFBSSxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDaEQsY0FBSSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUEsR0FBSSxDQUFDLEVBQUUsT0FBTyxJQUFJLENBQUM7U0FDckU7T0FDRjtBQUNELFVBQUksUUFBUSxJQUFJLE1BQU0sRUFBRSxPQUFPLElBQUksQ0FBQztBQUNwQyxhQUFPLFdBQVcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7S0FDNUUsTUFBTTtBQUNMLFVBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztLQUNyQztHQUNGO0NBQ0Y7O0FBRUQsU0FBUyxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMzQixPQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRTtBQUNwQixRQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxN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QUksQ0FBQyxDQUFBO0FBQzNCLE1BQUksSUFBSSxJQUFJLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLDRDQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUE7RUFDNUM7QUFDRCxRQUFPLEVBQUUsUUFBUTtBQUNqQixVQUFTLEVBQUUsT0FBTztBQUNsQixTQUFRLEVBQUUsRUFBRTtDQUNaLENBQUMsQ0FBQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZWx0ID0gZWx0O1xuZXhwb3J0cy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWU7XG5leHBvcnRzLnJtQ2xhc3MgPSBybUNsYXNzO1xuZXhwb3J0cy5hZGRDbGFzcyA9IGFkZENsYXNzO1xuZXhwb3J0cy5jb250YWlucyA9IGNvbnRhaW5zO1xuZXhwb3J0cy5pbnNlcnRDU1MgPSBpbnNlcnRDU1M7XG5cbmZ1bmN0aW9uIGVsdCh0YWcsIGF0dHJzKSB7XG4gIHZhciByZXN1bHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7XG4gIGlmIChhdHRycykgZm9yICh2YXIgX25hbWUgaW4gYXR0cnMpIHtcbiAgICBpZiAoX25hbWUgPT0gXCJzdHlsZVwiKSByZXN1bHQuc3R5bGUuY3NzVGV4dCA9IGF0dHJzW19uYW1lXTtlbHNlIGlmIChhdHRyc1tfbmFtZV0gIT0gbnVsbCkgcmVzdWx0LnNldEF0dHJpYnV0ZShfbmFtZSwgYXR0cnNbX25hbWVdKTtcbiAgfVxuXG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiA+IDIgPyBfbGVuIC0gMiA6IDApLCBfa2V5ID0gMjsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIGFyZ3NbX2tleSAtIDJdID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgYWRkKGFyZ3NbaV0sIHJlc3VsdCk7XG4gIH1yZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBhZGQodmFsdWUsIHRhcmdldCkge1xuICBpZiAodHlwZW9mIHZhbHVlID09IFwic3RyaW5nXCIpIHZhbHVlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodmFsdWUpO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhZGQodmFsdWVbaV0sIHRhcmdldCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRhcmdldC5hcHBlbmRDaGlsZCh2YWx1ZSk7XG4gIH1cbn1cblxudmFyIHJlcUZyYW1lID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCB3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8IHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgd2luZG93Lm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lO1xuXG5mdW5jdGlvbiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZikge1xuICBpZiAocmVxRnJhbWUpIHJlcUZyYW1lKGYpO2Vsc2Ugc2V0VGltZW91dChmLCAxMCk7XG59XG5cbnZhciBpZV91cHRvMTAgPSAvTVNJRSBcXGQvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG52YXIgaWVfMTF1cCA9IC9UcmlkZW50XFwvKD86WzctOV18XFxkezIsfSlcXC4uKnJ2OihcXGQrKS8uZXhlYyhuYXZpZ2F0b3IudXNlckFnZW50KTtcblxudmFyIGJyb3dzZXIgPSB7XG4gIG1hYzogL01hYy8udGVzdChuYXZpZ2F0b3IucGxhdGZvcm0pLFxuICBpZV91cHRvMTA6IGllX3VwdG8xMCxcbiAgaWVfMTF1cDogaWVfMTF1cCxcbiAgaWU6IGllX3VwdG8xMCB8fCBpZV8xMXVwLFxuICBnZWNrbzogL2dlY2tvXFwvXFxkL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KVxufTtcblxuZXhwb3J0cy5icm93c2VyID0gYnJvd3NlcjtcbmZ1bmN0aW9uIGNsYXNzVGVzdChjbHMpIHtcbiAgcmV0dXJuIG5ldyBSZWdFeHAoXCIoXnxcXFxccylcIiArIGNscyArIFwiKD86JHxcXFxccylcXFxccypcIik7XG59XG5cbmZ1bmN0aW9uIHJtQ2xhc3Mobm9kZSwgY2xzKSB7XG4gIHZhciBjdXJyZW50ID0gbm9kZS5jbGFzc05hbWU7XG4gIHZhciBtYXRjaCA9IGNsYXNzVGVzdChjbHMpLmV4ZWMoY3VycmVudCk7XG4gIGlmIChtYXRjaCkge1xuICAgIHZhciBhZnRlciA9IGN1cnJlbnQuc2xpY2UobWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGgpO1xuICAgIG5vZGUuY2xhc3NOYW1lID0gY3VycmVudC5zbGljZSgwLCBtYXRjaC5pbmRleCkgKyAoYWZ0ZXIgPyBtYXRjaFsxXSArIGFmdGVyIDogXCJcIik7XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkQ2xhc3Mobm9kZSwgY2xzKSB7XG4gIHZhciBjdXJyZW50ID0gbm9kZS5jbGFzc05hbWU7XG4gIGlmICghY2xhc3NUZXN0KGNscykudGVzdChjdXJyZW50KSkgbm9kZS5jbGFzc05hbWUgKz0gKGN1cnJlbnQgPyBcIiBcIiA6IFwiXCIpICsgY2xzO1xufVxuXG5mdW5jdGlvbiBjb250YWlucyhwYXJlbnQsIGNoaWxkKSB7XG4gIC8vIEFuZHJvaWQgYnJvd3NlciBhbmQgSUUgd2lsbCByZXR1cm4gZmFsc2UgaWYgY2hpbGQgaXMgYSB0ZXh0IG5vZGUuXG4gIGlmIChjaGlsZC5ub2RlVHlwZSAhPSAxKSBjaGlsZCA9IGNoaWxkLnBhcmVudE5vZGU7XG4gIHJldHVybiBjaGlsZCAmJiBwYXJlbnQuY29udGFpbnMoY2hpbGQpO1xufVxuXG5mdW5jdGlvbiBpbnNlcnRDU1MoY3NzKSB7XG4gIHZhciBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcbiAgc3R5bGUudGV4dENvbnRlbnQgPSBjc3M7XG4gIGRvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKHN0eWxlLCBkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3NlbGVjdGlvbiA9IHJlcXVpcmUoXCIuL3NlbGVjdGlvblwiKTtcblxudmFyIF9kb20gPSByZXF1aXJlKFwiLi4vZG9tXCIpO1xuXG52YXIgX2tleXMgPSByZXF1aXJlKFwiLi9rZXlzXCIpO1xuXG5mdW5jdGlvbiBub3RoaW5nKCkge31cblxuZnVuY3Rpb24gZW5zdXJlU2VsZWN0aW9uKHBtKSB7XG4gIGlmIChwbS5zZWxlY3Rpb24ubm9kZSkge1xuICAgIHZhciBmb3VuZCA9ICgwLCBfc2VsZWN0aW9uLmZpbmRTZWxlY3Rpb25OZWFyKShwbS5kb2MsIHBtLnNlbGVjdGlvbi5mcm9tLCAxLCB0cnVlKTtcbiAgICBpZiAoZm91bmQpICgwLCBfc2VsZWN0aW9uLnNldERPTVNlbGVjdGlvblRvUG9zKShwbSwgZm91bmQuaGVhZCk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBBIGJhY2tkcm9wIGtleW1hcCB1c2VkIHRvIG1ha2Ugc3VyZSB3ZSBhbHdheXMgc3VwcHJlc3Mga2V5cyB0aGF0XG4vLyBoYXZlIGEgZGFuZ2Vyb3VzIGRlZmF1bHQgZWZmZWN0LCBldmVuIGlmIHRoZSBjb21tYW5kcyB0aGV5IGFyZVxuLy8gYm91bmQgdG8gcmV0dXJuIGZhbHNlLCBhbmQgdG8gbWFrZSBzdXJlIHRoYXQgY3Vyc29yLW1vdGlvbiBrZXlzXG4vLyBmaW5kIGEgY3Vyc29yIChhcyBvcHBvc2VkIHRvIGEgbm9kZSBzZWxlY3Rpb24pIHdoZW4gcHJlc3NlZC5cblxudmFyIGtleXMgPSB7XG4gIFwiRXNjXCI6IG5vdGhpbmcsXG4gIFwiRW50ZXJcIjogbm90aGluZyxcbiAgXCJNb2QtRW50ZXJcIjogbm90aGluZyxcbiAgXCJTaGlmdC1FbnRlclwiOiBub3RoaW5nLFxuICBcIkJhY2tzcGFjZVwiOiBub3RoaW5nLFxuICBcIkRlbGV0ZVwiOiBub3RoaW5nLFxuICBcIk1vZC1CXCI6IG5vdGhpbmcsXG4gIFwiTW9kLUlcIjogbm90aGluZyxcbiAgXCJNb2QtQmFja3NwYWNlXCI6IG5vdGhpbmcsXG4gIFwiTW9kLURlbGV0ZVwiOiBub3RoaW5nLFxuICBcIlNoaWZ0LUJhY2tzcGFjZVwiOiBub3RoaW5nLFxuICBcIlNoaWZ0LURlbGV0ZVwiOiBub3RoaW5nLFxuICBcIlNoaWZ0LU1vZC1CYWNrc3BhY2VcIjogbm90aGluZyxcbiAgXCJTaGlmdC1Nb2QtRGVsZXRlXCI6IG5vdGhpbmcsXG4gIFwiTW9kLVpcIjogbm90aGluZyxcbiAgXCJNb2QtWVwiOiBub3RoaW5nLFxuICBcIlNoaWZ0LU1vZC1aXCI6IG5vdGhpbmcsXG4gIFwiQ3RybC1EXCI6IG5vdGhpbmcsXG4gIFwiQ3RybC1IXCI6IG5vdGhpbmcsXG4gIFwiQ3RybC1BbHQtQmFja3NwYWNlXCI6IG5vdGhpbmcsXG4gIFwiQWx0LURcIjogbm90aGluZyxcbiAgXCJBbHQtRGVsZXRlXCI6IG5vdGhpbmcsXG4gIFwiQWx0LUJhY2tzcGFjZVwiOiBub3RoaW5nLFxuXG4gIFwiTW9kLUFcIjogZW5zdXJlU2VsZWN0aW9uXG59O1tcIkxlZnRcIiwgXCJSaWdodFwiLCBcIlVwXCIsIFwiRG93blwiLCBcIkhvbWVcIiwgXCJFbmRcIiwgXCJQYWdlVXBcIiwgXCJQYWdlRG93blwiXS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAga2V5c1trZXldID0ga2V5c1tcIlNoaWZ0LVwiICsga2V5XSA9IGtleXNbXCJNb2QtXCIgKyBrZXldID0ga2V5c1tcIlNoaWZ0LU1vZC1cIiArIGtleV0gPSBrZXlzW1wiQWx0LVwiICsga2V5XSA9IGtleXNbXCJTaGlmdC1BbHQtXCIgKyBrZXldID0gZW5zdXJlU2VsZWN0aW9uO1xufSk7W1wiTGVmdFwiLCBcIk1vZC1MZWZ0XCIsIFwiUmlnaHRcIiwgXCJNb2QtUmlnaHRcIiwgXCJVcFwiLCBcIkRvd25cIl0uZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiBkZWxldGUga2V5c1trZXldO1xufSk7XG5cbmlmIChfZG9tLmJyb3dzZXIubWFjKSBrZXlzW1wiQ3RybC1GXCJdID0ga2V5c1tcIkN0cmwtQlwiXSA9IGtleXNbXCJDdHJsLVBcIl0gPSBrZXlzW1wiQ3RybC1OXCJdID0ga2V5c1tcIkFsdC1GXCJdID0ga2V5c1tcIkFsdC1CXCJdID0ga2V5c1tcIkN0cmwtQVwiXSA9IGtleXNbXCJDdHJsLUVcIl0gPSBrZXlzW1wiQ3RybC1WXCJdID0ga2V5c1tcImdvUGFnZVVwXCJdID0gZW5zdXJlU2VsZWN0aW9uO1xuXG52YXIgY2FwdHVyZUtleXMgPSBuZXcgX2tleXMuS2V5bWFwKGtleXMpO1xuZXhwb3J0cy5jYXB0dXJlS2V5cyA9IGNhcHR1cmVLZXlzOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5pc1dvcmRDaGFyID0gaXNXb3JkQ2hhcjtcbmV4cG9ydHMuY2hhckNhdGVnb3J5ID0gY2hhckNhdGVnb3J5O1xuZXhwb3J0cy5pc0V4dGVuZGluZ0NoYXIgPSBpc0V4dGVuZGluZ0NoYXI7XG52YXIgbm9uQVNDSUlTaW5nbGVDYXNlV29yZENoYXIgPSAvW1xcdTAwZGZcXHUwNTg3XFx1MDU5MC1cXHUwNWY0XFx1MDYwMC1cXHUwNmZmXFx1MzA0MC1cXHUzMDlmXFx1MzBhMC1cXHUzMGZmXFx1MzQwMC1cXHU0ZGI1XFx1NGUwMC1cXHU5ZmNjXFx1YWMwMC1cXHVkN2FmXS87XG5cbi8vIEV4dGVuZGluZyB1bmljb2RlIGNoYXJhY3RlcnMuIEEgc2VyaWVzIG9mIGEgbm9uLWV4dGVuZGluZyBjaGFyICtcbi8vIGFueSBudW1iZXIgb2YgZXh0ZW5kaW5nIGNoYXJzIGlzIHRyZWF0ZWQgYXMgYSBzaW5nbGUgdW5pdCBhcyBmYXJcbi8vIGFzIGVkaXRpbmcgYW5kIG1lYXN1cmluZyBpcyBjb25jZXJuZWQuIFRoaXMgaXMgbm90IGZ1bGx5IGNvcnJlY3QsXG4vLyBzaW5jZSBzb21lIHNjcmlwdHMvZm9udHMvYnJvd3NlcnMgYWxzbyB0cmVhdCBvdGhlciBjb25maWd1cmF0aW9uc1xuLy8gb2YgY29kZSBwb2ludHMgYXMgYSBncm91cC5cbnZhciBleHRlbmRpbmdDaGFyID0gL1tcXHUwMzAwLVxcdTAzNmZcXHUwNDgzLVxcdTA0ODlcXHUwNTkxLVxcdTA1YmRcXHUwNWJmXFx1MDVjMVxcdTA1YzJcXHUwNWM0XFx1MDVjNVxcdTA1YzdcXHUwNjEwLVxcdTA2MWFcXHUwNjRiLVxcdTA2NWVcXHUwNjcwXFx1MDZkNi1cXHUwNmRjXFx1MDZkZS1cXHUwNmU0XFx1MDZlN1xcdTA2ZThcXHUwNmVhLVxcdTA2ZWRcXHUwNzExXFx1MDczMC1cXHUwNzRhXFx1MDdhNi1cXHUwN2IwXFx1MDdlYi1cXHUwN2YzXFx1MDgxNi1cXHUwODE5XFx1MDgxYi1cXHUwODIzXFx1MDgyNS1cXHUwODI3XFx1MDgyOS1cXHUwODJkXFx1MDkwMC1cXHUwOTAyXFx1MDkzY1xcdTA5NDEtXFx1MDk0OFxcdTA5NGRcXHUwOTUxLVxcdTA5NTVcXHUwOTYyXFx1MDk2M1xcdTA5ODFcXHUwOWJjXFx1MDliZVxcdTA5YzEtXFx1MDljNFxcdTA5Y2RcXHUwOWQ3XFx1MDllMlxcdTA5ZTNcXHUwYTAxXFx1MGEwMlxcdTBhM2NcXHUwYTQxXFx1MGE0MlxcdTBhNDdcXHUwYTQ4XFx1MGE0Yi1cXHUwYTRkXFx1MGE1MVxcdTBhNzBcXHUwYTcxXFx1MGE3NVxcdTBhODFcXHUwYTgyXFx1MGFiY1xcdTBhYzEtXFx1MGFjNVxcdTBhYzdcXHUwYWM4XFx1MGFjZFxcdTBhZTJcXHUwYWUzXFx1MGIwMVxcdTBiM2NcXHUwYjNlXFx1MGIzZlxcdTBiNDEtXFx1MGI0NFxcdTBiNGRcXHUwYjU2XFx1MGI1N1xcdTBiNjJcXHUwYjYzXFx1MGI4MlxcdTBiYmVcXHUwYmMwXFx1MGJjZFxcdTBiZDdcXHUwYzNlLVxcdTBjNDBcXHUwYzQ2LVxcdTBjNDhcXHUwYzRhLVxcdTBjNGRcXHUwYzU1XFx1MGM1NlxcdTBjNjJcXHUwYzYzXFx1MGNiY1xcdTBjYmZcXHUwY2MyXFx1MGNjNlxcdTBjY2NcXHUwY2NkXFx1MGNkNVxcdTBjZDZcXHUwY2UyXFx1MGNlM1xcdTBkM2VcXHUwZDQxLVxcdTBkNDRcXHUwZDRkXFx1MGQ1N1xcdTBkNjJcXHUwZDYzXFx1MGRjYVxcdTBkY2ZcXHUwZGQyLVxcdTBkZDRcXHUwZGQ2XFx1MGRkZlxcdTBlMzFcXHUwZTM0LVxcdTBlM2FcXHUwZTQ3LVxcdTBlNGVcXHUwZWIxXFx1MGViNC1cXHUwZWI5XFx1MGViYlxcdTBlYmNcXHUwZWM4LVxcdTBlY2RcXHUwZjE4XFx1MGYxOVxcdTBmMzVcXHUwZjM3XFx1MGYzOVxcdTBmNzEtXFx1MGY3ZVxcdTBmODAtXFx1MGY4NFxcdTBmODZcXHUwZjg3XFx1MGY5MC1cXHUwZjk3XFx1MGY5OS1cXHUwZmJjXFx1MGZjNlxcdTEwMmQtXFx1MTAzMFxcdTEwMzItXFx1MTAzN1xcdTEwMzlcXHUxMDNhXFx1MTAzZFxcdTEwM2VcXHUxMDU4XFx1MTA1OVxcdTEwNWUtXFx1MTA2MFxcdTEwNzEtXFx1MTA3NFxcdTEwODJcXHUxMDg1XFx1MTA4NlxcdTEwOGRcXHUxMDlkXFx1MTM1ZlxcdTE3MTItXFx1MTcxNFxcdTE3MzItXFx1MTczNFxcdTE3NTJcXHUxNzUzXFx1MTc3MlxcdTE3NzNcXHUxN2I3LVxcdTE3YmRcXHUxN2M2XFx1MTdjOS1cXHUxN2QzXFx1MTdkZFxcdTE4MGItXFx1MTgwZFxcdTE4YTlcXHUxOTIwLVxcdTE5MjJcXHUxOTI3XFx1MTkyOFxcdTE5MzJcXHUxOTM5LVxcdTE5M2JcXHUxYTE3XFx1MWExOFxcdTFhNTZcXHUxYTU4LVxcdTFhNWVcXHUxYTYwXFx1MWE2MlxcdTFhNjUtXFx1MWE2Y1xcdTFhNzMtXFx1MWE3Y1xcdTFhN2ZcXHUxYjAwLVxcdTFiMDNcXHUxYjM0XFx1MWIzNi1cXHUxYjNhXFx1MWIzY1xcdTFiNDJcXHUxYjZiLVxcdTFiNzNcXHUxYjgwXFx1MWI4MVxcdTFiYTItXFx1MWJhNVxcdTFiYThcXHUxYmE5XFx1MWMyYy1cXHUxYzMzXFx1MWMzNlxcdTFjMzdcXHUxY2QwLVxcdTFjZDJcXHUxY2Q0LVxcdTFjZTBcXHUxY2UyLVxcdTFjZThcXHUxY2VkXFx1MWRjMC1cXHUxZGU2XFx1MWRmZC1cXHUxZGZmXFx1MjAwY1xcdTIwMGRcXHUyMGQwLVxcdTIwZjBcXHUyY2VmLVxcdTJjZjFcXHUyZGUwLVxcdTJkZmZcXHUzMDJhLVxcdTMwMmZcXHUzMDk5XFx1MzA5YVxcdWE2NmYtXFx1YTY3MlxcdWE2N2NcXHVhNjdkXFx1YTZmMFxcdWE2ZjFcXHVhODAyXFx1YTgwNlxcdWE4MGJcXHVhODI1XFx1YTgyNlxcdWE4YzRcXHVhOGUwLVxcdWE4ZjFcXHVhOTI2LVxcdWE5MmRcXHVhOTQ3LVxcdWE5NTFcXHVhOTgwLVxcdWE5ODJcXHVhOWIzXFx1YTliNi1cXHVhOWI5XFx1YTliY1xcdWFhMjktXFx1YWEyZVxcdWFhMzFcXHVhYTMyXFx1YWEzNVxcdWFhMzZcXHVhYTQzXFx1YWE0Y1xcdWFhYjBcXHVhYWIyLVxcdWFhYjRcXHVhYWI3XFx1YWFiOFxcdWFhYmVcXHVhYWJmXFx1YWFjMVxcdWFiZTVcXHVhYmU4XFx1YWJlZFxcdWRjMDAtXFx1ZGZmZlxcdWZiMWVcXHVmZTAwLVxcdWZlMGZcXHVmZTIwLVxcdWZlMjZcXHVmZjllXFx1ZmY5Zl0vO1xuXG5mdW5jdGlvbiBpc1dvcmRDaGFyKGNoKSB7XG4gIHJldHVybiAoL1xcdy8udGVzdChjaCkgfHwgaXNFeHRlbmRpbmdDaGFyKGNoKSB8fCBjaCA+IFwiXFx4ODBcIiAmJiAoY2gudG9VcHBlckNhc2UoKSAhPSBjaC50b0xvd2VyQ2FzZSgpIHx8IG5vbkFTQ0lJU2luZ2xlQ2FzZVdvcmRDaGFyLnRlc3QoY2gpKVxuICApO1xufVxuXG4vKipcbiAqIEdldCB0aGUgY2F0ZWdvcnkgb2YgYSBnaXZlbiBjaGFyYWN0ZXIuIEVpdGhlciBhIFwic3BhY2VcIixcbiAqIGEgY2hhcmFjdGVyIHRoYXQgY2FuIGJlIHBhcnQgb2YgYSB3b3JkIChcIndvcmRcIiksIG9yIGFueXRoaW5nIGVsc2UgKFwib3RoZXJcIikuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSBjaCBUaGUgY2hhcmFjdGVyLlxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5cbmZ1bmN0aW9uIGNoYXJDYXRlZ29yeShjaCkge1xuICByZXR1cm4gKC9cXHMvLnRlc3QoY2gpID8gXCJzcGFjZVwiIDogaXNXb3JkQ2hhcihjaCkgPyBcIndvcmRcIiA6IFwib3RoZXJcIlxuICApO1xufVxuXG5mdW5jdGlvbiBpc0V4dGVuZGluZ0NoYXIoY2gpIHtcbiAgcmV0dXJuIGNoLmNoYXJDb2RlQXQoMCkgPj0gNzY4ICYmIGV4dGVuZGluZ0NoYXIudGVzdChjaCk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfc2xpY2VkVG9BcnJheSA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIHNsaWNlSXRlcmF0b3IoYXJyLCBpKSB7IHZhciBfYXJyID0gW107IHZhciBfbiA9IHRydWU7IHZhciBfZCA9IGZhbHNlOyB2YXIgX2UgPSB1bmRlZmluZWQ7IHRyeSB7IGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHsgX2Fyci5wdXNoKF9zLnZhbHVlKTsgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrOyB9IH0gY2F0Y2ggKGVycikgeyBfZCA9IHRydWU7IF9lID0gZXJyOyB9IGZpbmFsbHkgeyB0cnkgeyBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdKSBfaVtcInJldHVyblwiXSgpOyB9IGZpbmFsbHkgeyBpZiAoX2QpIHRocm93IF9lOyB9IH0gcmV0dXJuIF9hcnI7IH0gcmV0dXJuIGZ1bmN0aW9uIChhcnIsIGkpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgeyByZXR1cm4gYXJyOyB9IGVsc2UgaWYgKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoYXJyKSkgeyByZXR1cm4gc2xpY2VJdGVyYXRvcihhcnIsIGkpOyB9IGVsc2UgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKTsgfSB9OyB9KSgpO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbmV4cG9ydHMuZGVmaW5lUGFyYW1IYW5kbGVyID0gZGVmaW5lUGFyYW1IYW5kbGVyO1xuZXhwb3J0cy5pbml0Q29tbWFuZHMgPSBpbml0Q29tbWFuZHM7XG5leHBvcnRzLmRlZmF1bHRLZXltYXAgPSBkZWZhdWx0S2V5bWFwO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIGFycjJbaV0gPSBhcnJbaV07IHJldHVybiBhcnIyOyB9IGVsc2UgeyByZXR1cm4gQXJyYXkuZnJvbShhcnIpOyB9IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIF9tb2RlbCA9IHJlcXVpcmUoXCIuLi9tb2RlbFwiKTtcblxudmFyIF90cmFuc2Zvcm0gPSByZXF1aXJlKFwiLi4vdHJhbnNmb3JtXCIpO1xuXG52YXIgX2RvbSA9IHJlcXVpcmUoXCIuLi9kb21cIik7XG5cbnZhciBfdXRpbFNvcnRlZGluc2VydCA9IHJlcXVpcmUoXCIuLi91dGlsL3NvcnRlZGluc2VydFwiKTtcblxudmFyIF91dGlsU29ydGVkaW5zZXJ0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3V0aWxTb3J0ZWRpbnNlcnQpO1xuXG52YXIgX2NoYXIgPSByZXF1aXJlKFwiLi9jaGFyXCIpO1xuXG52YXIgX2tleXMgPSByZXF1aXJlKFwiLi9rZXlzXCIpO1xuXG52YXIgX3NlbGVjdGlvbiA9IHJlcXVpcmUoXCIuL3NlbGVjdGlvblwiKTtcblxudmFyIF9vcHRpb25zID0gcmVxdWlyZShcIi4vb3B0aW9uc1wiKTtcblxudmFyIHBhcmFtSGFuZGxlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG52YXIgZW1wdHkgPSBbXTtcblxuLy8gRklYTUUgZG9jdW1lbnQgaW5kaXZpZHVhbCBjb21tYW5kc1xuXG4vLyA7OyBBIGNvbW1hbmQgaXMgYSBuYW1lZCBwaWVjZSBvZiBmdW5jdGlvbmFsaXR5IHRoYXQgY2FuIGJlIGJvdW5kIHRvXG4vLyBhIGtleSwgc2hvd24gaW4gdGhlIG1lbnUsIG9yIG90aGVyd2lzZSBleHBvc2VkIHRvIHRoZSB1c2VyLlxuLy9cbi8vIFRoZSBjb21tYW5kcyBhdmFpbGFibGUgaW4gYSBnaXZlbiBlZGl0b3IgYXJlIGdhdGhlcmVkIGZyb20gdGhlXG4vLyBbcmVnaXN0cmllc10oI3JlZ2lzdHJpZXMpIGdpdmVuIHRvIHRoZSBlZGl0b3IsIGFuZCB0aGUgbm9kZSBhbmRcbi8vIG1hcmsgdHlwZXMgaW4gaXRzIFtzY2hlbWFdKCNTY2hlbWEucmVnaXN0cnkpLiBVc2UgdGhlXG4vLyBbYHJlZ2lzdGVyYF0oI05vZGVUeXBlLnJlZ2lzdGVyKSBtZXRob2Qgd2l0aCBgXCJjb21tYW5kXCJgIGFzIHRoZVxuLy8gbmFtZSBhbmQgYSBgQ29tbWFuZFNwZWNgIGFzIHZhbHVlIHRvIGRlZmluZSBhIG5ldyBjb21tYW5kLlxuXG52YXIgQ29tbWFuZCA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIENvbW1hbmQoc3BlYywgc2VsZikge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDb21tYW5kKTtcblxuICAgIC8vIDo6IHN0cmluZyBUaGUgbmFtZSBvZiB0aGUgY29tbWFuZC5cbiAgICB0aGlzLm5hbWUgPSBzcGVjLm5hbWU7XG4gICAgaWYgKCF0aGlzLm5hbWUpIHRocm93IG5ldyBFcnJvcihcIlRyeWluZyB0byBkZWZpbmUgYSBjb21tYW5kIHdpdGhvdXQgYSBuYW1lXCIpO1xuICAgIC8vIDo6IENvbW1hbmRTcGVjIFRoZSBjb21tYW5kJ3Mgc3BlY2lmeWluZyBvYmplY3QuXG4gICAgdGhpcy5zcGVjID0gc3BlYztcbiAgICB0aGlzLnNlbGYgPSBzZWxmO1xuICB9XG5cbiAgLy8gOzsgI3BhdGg9Q29tbWFuZFNwZWMgI2tpbmQ9aW50ZXJmYWNlICN0b2M9ZmFsc2VcbiAgLy8gQ29tbWFuZHMgYXJlIGRlZmluZWQgdXNpbmcgb2JqZWN0cyB0aGF0IHNwZWNpZnkgdmFyaW91cyBhc3BlY3RzIG9mXG4gIC8vIHRoZSBjb21tYW5kLiBUaGUgb25seSBwcm9wZXJ0aWVzIHRoYXQgX211c3RfIGFwcGVhciBpbiBhIGNvbW1hbmRcbiAgLy8gc3BlYyBhcmUgW2BuYW1lYF0oI0NvbW1hbmRTcGVjLm5hbWUpIGFuZCBbYHJ1bmBdKCNDb21tYW5kU3BlYy5ydW4pLlxuICAvLyBZb3Ugc2hvdWxkIHByb2JhYmx5IGFsc28gZ2l2ZSB5b3VyIGNvbW1hbmRzIGEgYGxhYmVsYC5cblxuICAvLyA6OiBzdHJpbmcgI3BhdGg9Q29tbWFuZFNwZWMubmFtZVxuICAvLyBUaGUgbmFtZSBvZiB0aGUgY29tbWFuZCwgd2hpY2ggd2lsbCBiZSBpdHMga2V5IGluXG4gIC8vIGBQcm9zZU1pcnJvci5jb21tYW5kc2AsIGFuZCB0aGUgdGhpbmcgcGFzc2VkIHRvXG4gIC8vIFtgZXhlY0NvbW1hbmRgXSgjUHJvc2VNaXJyb3IuZXhlY0NvbW1hbmQpLlxuXG4gIC8vIDo6IHN0cmluZyAjcGF0aD1Db21tYW5kU3BlYy5sYWJlbFxuICAvLyBBIHVzZXItZmFjaW5nIGxhYmVsIGZvciB0aGUgY29tbWFuZC4gVGhpcyB3aWxsIGJlIHVzZWQsIGFtb25nIG90aGVyXG4gIC8vIHRoaW5ncy4gYXMgdGhlIHRvb2x0aXAgdGl0bGUgZm9yIHRoZSBjb21tYW5kJ3MgbWVudSBpdGVtLiBJZiB0aGVyZVxuICAvLyBpcyBubyBgbGFiZWxgLCB0aGUgY29tbWFuZCdzIGBuYW1lYCB3aWxsIGJlIHVzZWQgaW5zdGVhZC5cblxuICAvLyA6OiAocG06IFByb3NlTWlycm9yLCAuLi5wYXJhbXM6IFthbnldKSDihpIgP2Jvb2wgI3BhdGg9Q29tbWFuZFNwZWMucnVuXG4gIC8vIFRoZSBmdW5jdGlvbiB0aGF0IGV4ZWN1dGVzIHRoZSBjb21tYW5kLiBJZiB0aGUgY29tbWFuZCBoYXNcbiAgLy8gW3BhcmFtZXRlcnNdKCNDb21tYW5kU3BlYy5wYXJhbXMpLCB0aGVpciB2YWx1ZXMgYXJlIHBhc3NlZCBhc1xuICAvLyBhcmd1bWVudHMuIEZvciBjb21tYW5kcyBbcmVnaXN0ZXJlZF0oI05vZGVUeXBlLnJlZ2lzdGVyKSBvbiBub2RlIG9yXG4gIC8vIG1hcmsgdHlwZXMsIGB0aGlzYCB3aWxsIGJlIGJvdW5kIHRvIHRoZSBub2RlIG9yIG1hcmsgdHlwZSB3aGVuIHRoaXNcbiAgLy8gZnVuY3Rpb24gaXMgcmFuLiBTaG91bGQgcmV0dXJuIGBmYWxzZWAgd2hlbiB0aGUgY29tbWFuZCBjb3VsZCBub3RcbiAgLy8gYmUgZXhlY3V0ZWQuXG5cbiAgLy8gOjogW0NvbW1hbmRQYXJhbV0gI3BhdGg9Q29tbWFuZFNwZWMucGFyYW1zXG4gIC8vIFRoZSBwYXJhbWV0ZXJzIHRoYXQgdGhpcyBjb21tYW5kIGV4cGVjdHMuXG5cbiAgLy8gOjogKHBtOiBQcm9zZU1pcnJvcikg4oaSIGJvb2wgI3BhdGg9Q29tbWFuZFNwZWMuc2VsZWN0XG4gIC8vIFRoZSBmdW5jdGlvbiB1c2VkIHRvIFtzZWxlY3RdKCNDb21tYW5kLnNlbGVjdCkgdGhlIGNvbW1hbmQuIGB0aGlzYFxuICAvLyB3aWxsIGFnYWluIGJlIGJvdW5kIHRvIGEgbm9kZSBvciBtYXJrIHR5cGUsIHdoZW4gYXZhaWxhYmxlLlxuXG4gIC8vIDo6IChwbTogUHJvc2VNaXJyb3IpIOKGkiBib29sICNwYXRoPUNvbW1hbmRTcGVjLmFjdGl2ZVxuICAvLyBUaGUgZnVuY3Rpb24gdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgY29tbWFuZCBpc1xuICAvLyBbYWN0aXZlXSgjQ29tbWFuZC5hY3RpdmUpLiBgdGhpc2AgcmVmZXJzIHRvIHRoZSBhc3NvY2lhdGVkIG5vZGUgb3JcbiAgLy8gbWFyayB0eXBlLlxuXG4gIC8vIDo6IHVuaW9uPHN0cmluZywgW3N0cmluZ10+ICNwYXRoPUNvbW1hbmRTcGVjLmtleVxuICAvLyBUaGUgZGVmYXVsdCBrZXkgYmluZGluZyBvciBiaW5kaW5ncyBmb3IgdGhpcyBjb21tYW5kLlxuXG4gIC8vIDo6IHVuaW9uPHN0cmluZywgW3N0cmluZ10+ICNwYXRoPUNvbW1hbmRTcGVjLnBjS2V5XG4gIC8vIERlZmF1bHQga2V5IGJpbmRpbmcgb3IgYmluZGluZ3Mgc3BlY2lmaWMgdG8gbm9uLU1hYyBwbGF0Zm9ybXMuXG5cbiAgLy8gOjogdW5pb248c3RyaW5nLCBbc3RyaW5nXT4gI3BhdGg9Q29tbWFuZFNwZWMubWFjS2V5XG4gIC8vIERlZmF1bHQga2V5IGJpbmRpbmcgb3IgYmluZGluZ3Mgc3BlY2lmaWMgdG8gdGhlIE1hYyBwbGF0Zm9ybS5cblxuICAvLyBGSVhNRSBkb2N1bWVudCBtZW51IGFuZCBpY29uIHByb3BlcnRpZXNcblxuICAvLyA7OyAjcGF0aD1Db21tYW5kUGFyYW0gI2tpbmQ9aW50ZXJmYWNlICN0b2M9ZmFsc2VcbiAgLy8gVGhlIHBhcmFtZXRlcnMgdGhhdCBhIGNvbW1hbmQgY2FuIHRha2UgYXJlIHNwZWNpZmllZCB1c2luZyBvYmplY3RzXG4gIC8vIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuXG4gIC8vIDo6IHN0cmluZyAjcGF0aD1Db21tYW5kUGFyYW0ubGFiZWxcbiAgLy8gVGhlIHVzZXItZmFjaW5nIG5hbWUgb2YgdGhlIHBhcmFtZXRlci4gU2hvd24gdG8gdGhlIHVzZXIgd2hlblxuICAvLyBwcm9tcHRpbmcgZm9yIHRoaXMgcGFyYW1ldGVyLlxuXG4gIC8vIDo6IHN0cmluZyAjcGF0aD1Db21tYW5kUGFyYW0udHlwZVxuICAvLyBUaGUgdHlwZSBvZiB0aGUgcGFyYW1ldGVyLiBTdXBwb3J0ZWQgdHlwZXMgYXJlIGBcInRleHRcImAgYW5kIGBcInNlbGVjdFwiYC5cblxuICAvLyA6OiBhbnkgI3BhdGg9Q29tbWFuZFBhcmFtLmRlZmF1bHRcbiAgLy8gQSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcGFyYW1ldGVyLlxuXG4gIC8vIDo6IChzdHJpbmcsIChwbTogUHJvc2VNaXJyb3IsIGNtZDogQ29tbWFuZCwgY2FsbGJhY2s6ICg/W2FueV0pKSlcbiAgLy8gUmVnaXN0ZXIgYSBwYXJhbWV0ZXIgaGFuZGxlciwgd2hpY2ggaXMgYSBmdW5jdGlvbiB0aGF0IHByb21wdHMgdGhlXG4gIC8vIHVzZXIgdG8gZW50ZXIgdmFsdWVzIGZvciBhIGNvbW1hbmQncyBbcGFyYW1ldGVyc10oI0NvbW1hbmRQYXJhbSksIGFuZFxuICAvLyBjYWxscyBhIGNhbGxiYWNrIHdpdGggdGhlIHZhbHVlcyByZWNlaXZlZC4gU2VlIGFsc28gdGhlXG4gIC8vIFtgY29tbWFuZFBhcmFtSGFuZGxlcmAgb3B0aW9uXSgjY29tbWFuZFBhcmFtSGFuZGxlcikuXG5cbiAgLy8gOjogKFByb3NlTWlycm9yLCA/W2FueV0pIOKGkiA/Ym9vbFxuICAvLyBFeGVjdXRlIHRoaXMgY29tbWFuZC4gSWYgdGhlIGNvbW1hbmQgdGFrZXNcbiAgLy8gW3BhcmFtZXRlcnNdKCNDb21tYW5kLnBhcmFtcyksIHRoZXkgY2FuIGJlIHBhc3NlZCBhcyBzZWNvbmRcbiAgLy8gYXJndW1lbnQgaGVyZSwgb3Igb21pdHRlZCwgaW4gd2hpY2ggY2FzZSBhIFtwYXJhbWV0ZXJcbiAgLy8gaGFuZGxlcl0oI2RlZmluZVBhcmFtSGFuZGxlcikgd2lsbCBiZSBjYWxsZWQgdG8gcHJvbXB0IHRoZSB1c2VyXG4gIC8vIGZvciB2YWx1ZXMuXG4gIC8vXG4gIC8vIFJldHVybnMgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBjb21tYW5kIHNwZWMncyBbYHJ1bmBcbiAgLy8gbWV0aG9kXSgjQ29tbWFuZFNwZWMucnVuKSwgb3IgYGZhbHNlYCBpZiB0aGUgY29tbWFuZCBjb3VsZCBub3QgYmVcbiAgLy8gcmFuLlxuXG4gIF9jcmVhdGVDbGFzcyhDb21tYW5kLCBbe1xuICAgIGtleTogXCJleGVjXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGV4ZWMocG0sIHBhcmFtcykge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIHJ1biA9IHRoaXMuc3BlYy5ydW47XG4gICAgICBpZiAoIXRoaXMucGFyYW1zLmxlbmd0aCkgcmV0dXJuIHJ1bi5jYWxsKHRoaXMuc2VsZiwgcG0pO1xuICAgICAgaWYgKHBhcmFtcykgcmV0dXJuIHJ1bi5jYWxsLmFwcGx5KHJ1biwgW3RoaXMuc2VsZiwgcG1dLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkocGFyYW1zKSkpO1xuICAgICAgdmFyIGhhbmRsZXIgPSBnZXRQYXJhbUhhbmRsZXIocG0pO1xuICAgICAgaWYgKCFoYW5kbGVyKSByZXR1cm4gZmFsc2U7XG4gICAgICBoYW5kbGVyKHBtLCB0aGlzLCBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIGlmIChwYXJhbXMpIHJ1bi5jYWxsLmFwcGx5KHJ1biwgW190aGlzLnNlbGYsIHBtXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHBhcmFtcykpKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIDo6IChQcm9zZU1pcnJvcikg4oaSIGJvb2xcbiAgICAvLyBBc2sgdGhpcyBjb21tYW5kIHdoZXRoZXIgaXQgaXMgY3VycmVudGx5IHJlbGV2YW50LCBnaXZlbiB0aGVcbiAgICAvLyBlZGl0b3IncyBkb2N1bWVudCBhbmQgc2VsZWN0aW9uLiBJZiB0aGUgY29tbWFuZCBkb2VzIG5vdCBkZWZpbmUgYVxuICAgIC8vIFtgc2VsZWN0YF0oI0NvbW1hbmRTcGVjLnNlbGVjdCkgbWV0aG9kLCB0aGlzIGFsd2F5cyByZXR1cm5zIHRydWUuXG4gIH0sIHtcbiAgICBrZXk6IFwic2VsZWN0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNlbGVjdChwbSkge1xuICAgICAgdmFyIGYgPSB0aGlzLnNwZWMuc2VsZWN0O1xuICAgICAgcmV0dXJuIGYgPyBmLmNhbGwodGhpcy5zZWxmLCBwbSkgOiB0cnVlO1xuICAgIH1cblxuICAgIC8vIDo6IChQcm9zZU1pcnJvcikg4oaSIGJvb2xcbiAgICAvLyBBc2sgdGhpcyBjb21tYW5kIHdoZXRoZXIgaXQgaXMg4oCcYWN0aXZl4oCdLiBUaGlzIGlzIG1vc3RseSB1c2VkIHRvXG4gICAgLy8gc3R5bGUgaW5saW5lIG1hcmsgaWNvbnMgKHN1Y2ggYXMgc3Ryb25nKSBkaWZmZXJlbnRseSB3aGVuIHRoZVxuICAgIC8vIHNlbGVjdGlvbiBjb250YWlucyBzdWNoIG1hcmtzLlxuICB9LCB7XG4gICAga2V5OiBcImFjdGl2ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhY3RpdmUocG0pIHtcbiAgICAgIHZhciBmID0gdGhpcy5zcGVjLmFjdGl2ZTtcbiAgICAgIHJldHVybiBmID8gZi5jYWxsKHRoaXMuc2VsZiwgcG0pIDogZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gOjogW0NvbW1hbmRQYXJhbV1cbiAgICAvLyBHZXQgdGhlIGxpc3Qgb2YgcGFyYW1ldGVycyB0aGF0IHRoaXMgY29tbWFuZCBleHBlY3RzLlxuICB9LCB7XG4gICAga2V5OiBcInBhcmFtc1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuc3BlYy5wYXJhbXMgfHwgZW1wdHk7XG4gICAgfVxuXG4gICAgLy8gOjogc3RyaW5nXG4gICAgLy8gR2V0IHRoZSBsYWJlbCBmb3IgdGhpcyBjb21tYW5kLlxuICB9LCB7XG4gICAga2V5OiBcImxhYmVsXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zcGVjLmxhYmVsIHx8IHRoaXMubmFtZTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQ29tbWFuZDtcbn0pKCk7XG5cbmV4cG9ydHMuQ29tbWFuZCA9IENvbW1hbmQ7XG5cbmZ1bmN0aW9uIGRlZmluZVBhcmFtSGFuZGxlcihuYW1lLCBoYW5kbGVyKSB7XG4gIHBhcmFtSGFuZGxlcnNbbmFtZV0gPSBoYW5kbGVyO1xufVxuXG5mdW5jdGlvbiBnZXRQYXJhbUhhbmRsZXIocG0pIHtcbiAgdmFyIG9wdGlvbiA9IHBtLm9wdGlvbnMuY29tbWFuZFBhcmFtSGFuZGxlcjtcbiAgaWYgKG9wdGlvbiAmJiBwYXJhbUhhbmRsZXJzW29wdGlvbl0pIHJldHVybiBwYXJhbUhhbmRsZXJzW29wdGlvbl07XG59XG5cbmZ1bmN0aW9uIGluaXRDb21tYW5kcyhwbSkge1xuICB2YXIgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgcG0ucmVnaXN0cnkoXCJjb21tYW5kXCIsIGZ1bmN0aW9uIChzcGVjLCB0eXBlKSB7XG4gICAgcmVzdWx0W3NwZWMubmFtZV0gPSBuZXcgQ29tbWFuZChzcGVjLCB0eXBlKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRLZXltYXAocG0pIHtcbiAgdmFyIGJpbmRpbmdzID0ge307XG4gIGZ1bmN0aW9uIGFkZChjb21tYW5kLCBrZXkpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShrZXkpKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleS5sZW5ndGg7IGkrKykge1xuICAgICAgICBhZGQoY29tbWFuZCwga2V5W2ldKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGtleSkge1xuICAgICAgdmFyIF9kJCRleGVjID0gL14oLis/KSg/OlxcKChcXGQrKVxcKSk/JC8uZXhlYyhrZXkpO1xuXG4gICAgICB2YXIgX2QkJGV4ZWMyID0gX3NsaWNlZFRvQXJyYXkoX2QkJGV4ZWMsIDMpO1xuXG4gICAgICB2YXIgXyA9IF9kJCRleGVjMlswXTtcbiAgICAgIHZhciBfbmFtZSA9IF9kJCRleGVjMlsxXTtcbiAgICAgIHZhciBfZCQkZXhlYzIkMiA9IF9kJCRleGVjMlsyXTtcbiAgICAgIHZhciByYW5rID0gX2QkJGV4ZWMyJDIgPT09IHVuZGVmaW5lZCA/IDUwIDogX2QkJGV4ZWMyJDI7XG5cbiAgICAgICgwLCBfdXRpbFNvcnRlZGluc2VydDJbXCJkZWZhdWx0XCJdKShiaW5kaW5nc1tfbmFtZV0gfHwgKGJpbmRpbmdzW19uYW1lXSA9IFtdKSwgeyBjb21tYW5kOiBjb21tYW5kLCByYW5rOiByYW5rIH0sIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIHJldHVybiBhLnJhbmsgLSBiLnJhbms7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgZm9yICh2YXIgX25hbWUyIGluIHBtLmNvbW1hbmRzKSB7XG4gICAgdmFyIGNtZCA9IHBtLmNvbW1hbmRzW19uYW1lMl07XG4gICAgYWRkKF9uYW1lMiwgY21kLnNwZWMua2V5KTtcbiAgICBhZGQoX25hbWUyLCBfZG9tLmJyb3dzZXIubWFjID8gY21kLnNwZWMubWFjS2V5IDogY21kLnNwZWMucGNLZXkpO1xuICB9XG5cbiAgZm9yICh2YXIga2V5IGluIGJpbmRpbmdzKSB7XG4gICAgYmluZGluZ3Nba2V5XSA9IGJpbmRpbmdzW2tleV0ubWFwKGZ1bmN0aW9uIChiKSB7XG4gICAgICByZXR1cm4gYi5jb21tYW5kO1xuICAgIH0pO1xuICB9cmV0dXJuIG5ldyBfa2V5cy5LZXltYXAoYmluZGluZ3MpO1xufVxuXG52YXIgYW5kU2Nyb2xsID0geyBzY3JvbGxJbnRvVmlldzogdHJ1ZSB9O1xuXG5fbW9kZWwuSGFyZEJyZWFrLnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gIG5hbWU6IFwiaW5zZXJ0SGFyZEJyZWFrXCIsXG4gIGxhYmVsOiBcIkluc2VydCBoYXJkIGJyZWFrXCIsXG4gIHJ1bjogZnVuY3Rpb24gcnVuKHBtKSB7XG4gICAgdmFyIF9wbSRzZWxlY3Rpb24gPSBwbS5zZWxlY3Rpb247XG4gICAgdmFyIG5vZGUgPSBfcG0kc2VsZWN0aW9uLm5vZGU7XG4gICAgdmFyIGZyb20gPSBfcG0kc2VsZWN0aW9uLmZyb207XG5cbiAgICBpZiAobm9kZSAmJiBub2RlLmlzQmxvY2spIHJldHVybiBmYWxzZTtlbHNlIGlmIChwbS5kb2MucGF0aChmcm9tLnBhdGgpLnR5cGUuaXNDb2RlKSByZXR1cm4gcG0udHIudHlwZVRleHQoXCJcXG5cIikuYXBwbHkoYW5kU2Nyb2xsKTtlbHNlIHJldHVybiBwbS50ci5yZXBsYWNlU2VsZWN0aW9uKHRoaXMuY3JlYXRlKCkpLmFwcGx5KGFuZFNjcm9sbCk7XG4gIH0sXG4gIGtleTogW1wiTW9kLUVudGVyXCIsIFwiU2hpZnQtRW50ZXJcIl1cbn0pO1xuXG5mdW5jdGlvbiBtYXJrQWN0aXZlKHBtLCB0eXBlKSB7XG4gIHZhciBzZWwgPSBwbS5zZWxlY3Rpb247XG4gIGlmIChzZWwuZW1wdHkpIHJldHVybiB0eXBlLmlzSW5TZXQocG0uYWN0aXZlTWFya3MoKSk7ZWxzZSByZXR1cm4gcG0uZG9jLnJhbmdlSGFzTWFyayhzZWwuZnJvbSwgc2VsLnRvLCB0eXBlKTtcbn1cblxuZnVuY3Rpb24gY2FuQWRkSW5saW5lKHBtLCB0eXBlKSB7XG4gIHZhciBfcG0kc2VsZWN0aW9uMiA9IHBtLnNlbGVjdGlvbjtcbiAgdmFyIGZyb20gPSBfcG0kc2VsZWN0aW9uMi5mcm9tO1xuICB2YXIgdG8gPSBfcG0kc2VsZWN0aW9uMi50bztcbiAgdmFyIGVtcHR5ID0gX3BtJHNlbGVjdGlvbjIuZW1wdHk7XG5cbiAgaWYgKGVtcHR5KSByZXR1cm4gIXR5cGUuaXNJblNldChwbS5hY3RpdmVNYXJrcygpKSAmJiBwbS5kb2MucGF0aChmcm9tLnBhdGgpLnR5cGUuY2FuQ29udGFpbk1hcmsodHlwZSk7XG4gIHZhciBjYW4gPSBmYWxzZTtcbiAgcG0uZG9jLm5vZGVzQmV0d2Vlbihmcm9tLCB0bywgZnVuY3Rpb24gKG5vZGUpIHtcbiAgICBpZiAoY2FuIHx8IG5vZGUuaXNUZXh0YmxvY2sgJiYgIW5vZGUudHlwZS5jYW5Db250YWluTWFyayh0eXBlKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChub2RlLmlzSW5saW5lICYmICF0eXBlLmlzSW5TZXQobm9kZS5tYXJrcykpIGNhbiA9IHRydWU7XG4gIH0pO1xuICByZXR1cm4gY2FuO1xufVxuXG5mdW5jdGlvbiBtYXJrQXBwbGllcyhwbSwgdHlwZSkge1xuICB2YXIgX3BtJHNlbGVjdGlvbjMgPSBwbS5zZWxlY3Rpb247XG4gIHZhciBmcm9tID0gX3BtJHNlbGVjdGlvbjMuZnJvbTtcbiAgdmFyIHRvID0gX3BtJHNlbGVjdGlvbjMudG87XG5cbiAgdmFyIHJlbGV2YW50ID0gZmFsc2U7XG4gIHBtLmRvYy5ub2Rlc0JldHdlZW4oZnJvbSwgdG8sIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgaWYgKG5vZGUuaXNUZXh0YmxvY2spIHtcbiAgICAgIGlmIChub2RlLnR5cGUuY2FuQ29udGFpbk1hcmsodHlwZSkpIHJlbGV2YW50ID0gdHJ1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVsZXZhbnQ7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlTWFya0NvbW1hbmRzKHR5cGUsIG5hbWUsIGxhYmVsTmFtZSwgc3BlYykge1xuICBpZiAoIWxhYmVsTmFtZSkgbGFiZWxOYW1lID0gbmFtZTtcbiAgdmFyIGNhcCA9IG5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpO1xuICB0eXBlLnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gICAgbmFtZTogXCJzZXRcIiArIGNhcCxcbiAgICBsYWJlbDogXCJTZXQgXCIgKyBsYWJlbE5hbWUsXG4gICAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICAgIHBtLnNldE1hcmsodGhpcywgdHJ1ZSk7XG4gICAgfSxcbiAgICBzZWxlY3Q6IGZ1bmN0aW9uIHNlbGVjdChwbSkge1xuICAgICAgcmV0dXJuIGNhbkFkZElubGluZShwbSwgdGhpcyk7XG4gICAgfSxcbiAgICBpY29uOiB7IGZyb206IG5hbWUgfVxuICB9KTtcbiAgdHlwZS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xuICAgIG5hbWU6IFwidW5zZXRcIiArIGNhcCxcbiAgICBsYWJlbDogXCJSZW1vdmUgXCIgKyBsYWJlbE5hbWUsXG4gICAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICAgIHBtLnNldE1hcmsodGhpcywgZmFsc2UpO1xuICAgIH0sXG4gICAgc2VsZWN0OiBmdW5jdGlvbiBzZWxlY3QocG0pIHtcbiAgICAgIHJldHVybiBtYXJrQWN0aXZlKHBtLCB0aGlzKTtcbiAgICB9LFxuICAgIGljb246IHsgZnJvbTogbmFtZSB9XG4gIH0pO1xuICB2YXIgY29tbWFuZCA9IHtcbiAgICBuYW1lOiBuYW1lLFxuICAgIGxhYmVsOiBcIlRvZ2dsZSBcIiArIGxhYmVsTmFtZSxcbiAgICBydW46IGZ1bmN0aW9uIHJ1bihwbSkge1xuICAgICAgcG0uc2V0TWFyayh0aGlzLCBudWxsKTtcbiAgICB9LFxuICAgIGFjdGl2ZTogZnVuY3Rpb24gYWN0aXZlKHBtKSB7XG4gICAgICByZXR1cm4gbWFya0FjdGl2ZShwbSwgdGhpcyk7XG4gICAgfSxcbiAgICBzZWxlY3Q6IGZ1bmN0aW9uIHNlbGVjdChwbSkge1xuICAgICAgcmV0dXJuIG1hcmtBcHBsaWVzKHBtLCB0aGlzKTtcbiAgICB9XG4gIH07XG4gIGZvciAodmFyIHByb3AgaW4gc3BlYykge1xuICAgIGNvbW1hbmRbcHJvcF0gPSBzcGVjW3Byb3BdO1xuICB9dHlwZS5yZWdpc3RlcihcImNvbW1hbmRcIiwgY29tbWFuZCk7XG59XG5cbmdlbmVyYXRlTWFya0NvbW1hbmRzKF9tb2RlbC5TdHJvbmdNYXJrLCBcInN0cm9uZ1wiLCBudWxsLCB7XG4gIG1lbnVHcm91cDogXCJpbmxpbmVcIiwgbWVudVJhbms6IDIwLFxuICBpY29uOiB7XG4gICAgd2lkdGg6IDgwNSwgaGVpZ2h0OiAxMDI0LFxuICAgIHBhdGg6IFwiTTMxNyA4NjlxNDIgMTggODAgMTggMjE0IDAgMjE0LTE5MSAwLTY1LTIzLTEwMi0xNS0yNS0zNS00MnQtMzgtMjYtNDYtMTQtNDgtNi01NC0xcS00MSAwLTU3IDUgMCAzMC0wIDkwdC0wIDkwcTAgNC0wIDM4dC0wIDU1IDIgNDcgNiAzOHpNMzA5IDQ0MnEyNCA0IDYyIDQgNDYgMCA4MS03dDYyLTI1IDQyLTUxIDE0LTgxcTAtNDAtMTYtNzB0LTQ1LTQ2LTYxLTI0LTcwLThxLTI4IDAtNzQgNyAwIDI4IDIgODZ0MiA4NnEwIDE1LTAgNDV0LTAgNDVxMCAyNiAwIDM5ek0wIDk1MGwxLTUzcTgtMiA0OC05dDYwLTE1cTQtNiA3LTE1dDQtMTkgMy0xOCAxLTIxIDAtMTl2LTM3cTAtNTYxLTEyLTU4NS0yLTQtMTItOHQtMjUtNi0yOC00LTI3LTItMTctMWwtMi00N3E1Ni0xIDE5NC02dDIxMy01cTEzIDAgMzkgMHQzOCAwcTQwIDAgNzggN3Q3MyAyNCA2MSA0MCA0MiA1OSAxNiA3OHEwIDI5LTkgNTR0LTIyIDQxLTM2IDMyLTQxIDI1LTQ4IDIycTg4IDIwIDE0NiA3NnQ1OCAxNDFxMCA1Ny0yMCAxMDJ0LTUzIDc0LTc4IDQ4LTkzIDI3LTEwMCA4cS0yNSAwLTc1LTF0LTc1LTFxLTYwIDAtMTc1IDZ0LTEzMiA2elwiXG4gIH0sXG4gIGtleTogXCJNb2QtQlwiXG59KTtcblxuZ2VuZXJhdGVNYXJrQ29tbWFuZHMoX21vZGVsLkVtTWFyaywgXCJlbVwiLCBcImVtcGhhc2lzXCIsIHtcbiAgbWVudUdyb3VwOiBcImlubGluZVwiLCBtZW51UmFuazogMjEsXG4gIGljb246IHtcbiAgICB3aWR0aDogNTg1LCBoZWlnaHQ6IDEwMjQsXG4gICAgcGF0aDogXCJNMCA5NDlsOS00OHEzLTEgNDYtMTJ0NjMtMjFxMTYtMjAgMjMtNTcgMC00IDM1LTE2NXQ2NS0zMTAgMjktMTY5di0xNHEtMTMtNy0zMS0xMHQtMzktNC0zMy0zbDEwLTU4cTE4IDEgNjggM3Q4NSA0IDY4IDFxMjcgMCA1Ni0xdDY5LTQgNTYtM3EtMiAyMi0xMCA1MC0xNyA1LTU4IDE2dC02MiAxOXEtNCAxMC04IDI0dC01IDIyLTQgMjYtMyAyNHEtMTUgODQtNTAgMjM5dC00NCAyMDNxLTEgNS03IDMzdC0xMSA1MS05IDQ3LTMgMzJsMCAxMHE5IDIgMTA1IDE3LTEgMjUtOSA1Ni02IDAtMTggMHQtMTggMHEtMTYgMC00OS01dC00OS01cS03OC0xLTExNy0xLTI5IDAtODEgNXQtNjkgNnpcIlxuICB9LFxuICBrZXk6IFwiTW9kLUlcIlxufSk7XG5cbmdlbmVyYXRlTWFya0NvbW1hbmRzKF9tb2RlbC5Db2RlTWFyaywgXCJjb2RlXCIsIG51bGwsIHtcbiAgbWVudUdyb3VwOiBcImlubGluZVwiLCBtZW51UmFuazogMjIsXG4gIGljb246IHtcbiAgICB3aWR0aDogODk2LCBoZWlnaHQ6IDEwMjQsXG4gICAgcGF0aDogXCJNNjA4IDE5MmwtOTYgOTYgMjI0IDIyNC0yMjQgMjI0IDk2IDk2IDI4OC0zMjAtMjg4LTMyMHpNMjg4IDE5MmwtMjg4IDMyMCAyODggMzIwIDk2LTk2LTIyNC0yMjQgMjI0LTIyNC05Ni05NnpcIlxuICB9LFxuICBrZXk6IFwiTW9kLWBcIlxufSk7XG5cbl9tb2RlbC5MaW5rTWFyay5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xuICBuYW1lOiBcInVubGlua1wiLFxuICBsYWJlbDogXCJVbmxpbmtcIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICBwbS5zZXRNYXJrKHRoaXMsIGZhbHNlKTtcbiAgfSxcbiAgc2VsZWN0OiBmdW5jdGlvbiBzZWxlY3QocG0pIHtcbiAgICByZXR1cm4gbWFya0FjdGl2ZShwbSwgdGhpcyk7XG4gIH0sXG4gIGFjdGl2ZTogZnVuY3Rpb24gYWN0aXZlKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBtZW51R3JvdXA6IFwiaW5saW5lXCIsIG1lbnVSYW5rOiAzMCxcbiAgaWNvbjogeyBmcm9tOiBcImxpbmtcIiB9XG59KTtcblxuX21vZGVsLkxpbmtNYXJrLnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gIG5hbWU6IFwibGlua1wiLFxuICBsYWJlbDogXCJBZGQgbGlua1wiLFxuICBydW46IGZ1bmN0aW9uIHJ1bihwbSwgaHJlZiwgdGl0bGUpIHtcbiAgICBwbS5zZXRNYXJrKHRoaXMsIHRydWUsIHsgaHJlZjogaHJlZiwgdGl0bGU6IHRpdGxlIH0pO1xuICB9LFxuICBwYXJhbXM6IFt7IGxhYmVsOiBcIlRhcmdldFwiLCB0eXBlOiBcInRleHRcIiB9LCB7IGxhYmVsOiBcIlRpdGxlXCIsIHR5cGU6IFwidGV4dFwiLCBcImRlZmF1bHRcIjogXCJcIiB9XSxcbiAgc2VsZWN0OiBmdW5jdGlvbiBzZWxlY3QocG0pIHtcbiAgICByZXR1cm4gbWFya0FwcGxpZXMocG0sIHRoaXMpICYmICFtYXJrQWN0aXZlKHBtLCB0aGlzKTtcbiAgfSxcbiAgbWVudUdyb3VwOiBcImlubGluZVwiLCBtZW51UmFuazogMzAsXG4gIGljb246IHtcbiAgICB3aWR0aDogOTUxLCBoZWlnaHQ6IDEwMjQsXG4gICAgcGF0aDogXCJNODMyIDY5NHEwLTIyLTE2LTM4bC0xMTgtMTE4cS0xNi0xNi0zOC0xNi0yNCAwLTQxIDE4IDEgMSAxMCAxMHQxMiAxMiA4IDEwIDcgMTQgMiAxNXEwIDIyLTE2IDM4dC0zOCAxNnEtOCAwLTE1LTJ0LTE0LTctMTAtOC0xMi0xMi0xMC0xMHEtMTggMTctMTggNDEgMCAyMiAxNiAzOGwxMTcgMTE4cTE1IDE1IDM4IDE1IDIyIDAgMzgtMTRsODQtODNxMTYtMTYgMTYtMzh6TTQzMCAyOTJxMC0yMi0xNi0zOGwtMTE3LTExOHEtMTYtMTYtMzgtMTYtMjIgMC0zOCAxNWwtODQgODNxLTE2IDE2LTE2IDM4IDAgMjIgMTYgMzhsMTE4IDExOHExNSAxNSAzOCAxNSAyNCAwIDQxLTE3LTEtMS0xMC0xMHQtMTItMTItOC0xMC03LTE0LTItMTVxMC0yMiAxNi0zOHQzOC0xNnE4IDAgMTUgMnQxNCA3IDEwIDggMTIgMTIgMTAgMTBxMTgtMTcgMTgtNDF6TTk0MSA2OTRxMCA2OC00OCAxMTZsLTg0IDgzcS00NyA0Ny0xMTYgNDctNjkgMC0xMTYtNDhsLTExNy0xMThxLTQ3LTQ3LTQ3LTExNiAwLTcwIDUwLTExOWwtNTAtNTBxLTQ5IDUwLTExOCA1MC02OCAwLTExNi00OGwtMTE4LTExOHEtNDgtNDgtNDgtMTE2dDQ4LTExNmw4NC04M3E0Ny00NyAxMTYtNDcgNjkgMCAxMTYgNDhsMTE3IDExOHE0NyA0NyA0NyAxMTYgMCA3MC01MCAxMTlsNTAgNTBxNDktNTAgMTE4LTUwIDY4IDAgMTE2IDQ4bDExOCAxMThxNDggNDggNDggMTE2elwiXG4gIH1cbn0pO1xuXG5fbW9kZWwuSW1hZ2UucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcbiAgbmFtZTogXCJpbnNlcnRJbWFnZVwiLFxuICBsYWJlbDogXCJJbnNlcnQgaW1hZ2VcIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0sIHNyYywgYWx0LCB0aXRsZSkge1xuICAgIHJldHVybiBwbS50ci5yZXBsYWNlU2VsZWN0aW9uKHRoaXMuY3JlYXRlKHsgc3JjOiBzcmMsIHRpdGxlOiB0aXRsZSwgYWx0OiBhbHQgfSkpLmFwcGx5KGFuZFNjcm9sbCk7XG4gIH0sXG4gIHBhcmFtczogW3sgbGFiZWw6IFwiSW1hZ2UgVVJMXCIsIHR5cGU6IFwidGV4dFwiIH0sIHsgbGFiZWw6IFwiRGVzY3JpcHRpb24gLyBhbHRlcm5hdGl2ZSB0ZXh0XCIsIHR5cGU6IFwidGV4dFwiLCBcImRlZmF1bHRcIjogXCJcIiB9LCB7IGxhYmVsOiBcIlRpdGxlXCIsIHR5cGU6IFwidGV4dFwiLCBcImRlZmF1bHRcIjogXCJcIiB9XSxcbiAgc2VsZWN0OiBmdW5jdGlvbiBzZWxlY3QocG0pIHtcbiAgICByZXR1cm4gcG0uZG9jLnBhdGgocG0uc2VsZWN0aW9uLmZyb20ucGF0aCkudHlwZS5jYW5Db250YWluVHlwZSh0aGlzKTtcbiAgfSxcbiAgbWVudUdyb3VwOiBcImlubGluZVwiLCBtZW51UmFuazogNDAsXG4gIGljb246IHtcbiAgICB3aWR0aDogMTA5NywgaGVpZ2h0OiAxMDI0LFxuICAgIHBhdGg6IFwiTTM2NSAzMjlxMCA0NS0zMiA3N3QtNzcgMzItNzctMzItMzItNzcgMzItNzcgNzctMzIgNzcgMzIgMzIgNzd6TTk1MCA1NDh2MjU2aC04MDR2LTEwOWwxODItMTgyIDkxIDkxIDI5Mi0yOTJ6TTEwMDUgMTQ2aC05MTRxLTcgMC0xMiA1dC01IDEydjY5NHEwIDcgNSAxMnQxMiA1aDkxNHE3IDAgMTItNXQ1LTEydi02OTRxMC03LTUtMTJ0LTEyLTV6TTEwOTcgMTY0djY5NHEwIDM3LTI2IDY0dC02NCAyNmgtOTE0cS0zNyAwLTY0LTI2dC0yNi02NHYtNjk0cTAtMzcgMjYtNjR0NjQtMjZoOTE0cTM3IDAgNjQgMjZ0MjYgNjR6XCJcbiAgfSxcbiAgcHJlZmlsbFBhcmFtczogZnVuY3Rpb24gcHJlZmlsbFBhcmFtcyhwbSkge1xuICAgIHZhciBub2RlID0gcG0uc2VsZWN0aW9uLm5vZGU7XG5cbiAgICBpZiAobm9kZSAmJiBub2RlLnR5cGUgPT0gdGhpcykgcmV0dXJuIFtub2RlLmF0dHJzLnNyYywgbm9kZS5hdHRycy5hbHQsIG5vZGUuYXR0cnMudGl0bGVdO1xuICB9XG59KTtcblxuLyoqXG4gKiBHZXQgYW4gb2Zmc2V0IG1vdmluZyBiYWNrd2FyZCBmcm9tIGEgY3VycmVudCBvZmZzZXQgaW5zaWRlIGEgbm9kZS5cbiAqXG4gKiBAcGFyYW0gIHtPYmplY3R9IHBhcmVudCBUaGUgcGFyZW50IG5vZGUuXG4gKiBAcGFyYW0gIHtpbnR9ICAgIG9mZnNldCBPZmZzZXQgdG8gbW92ZSBmcm9tIGluc2lkZSB0aGUgbm9kZS5cbiAqIEBwYXJhbSAge3N0cmluZ30gYnkgICAgIFNpemUgdG8gZGVsZXRlIGJ5LiBFaXRoZXIgXCJjaGFyXCIgb3IgXCJ3b3JkXCIuXG4gKi9cbmZ1bmN0aW9uIG1vdmVCYWNrd2FyZChwYXJlbnQsIG9mZnNldCwgYnkpIHtcbiAgaWYgKGJ5ICE9IFwiY2hhclwiICYmIGJ5ICE9IFwid29yZFwiKSB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIG1vdGlvbiB1bml0OiBcIiArIGJ5KTtcblxuICB2YXIgY2F0ID0gbnVsbCxcbiAgICAgIGNvdW50ZWQgPSAwO1xuICBmb3IgKDs7KSB7XG4gICAgaWYgKG9mZnNldCA9PSAwKSByZXR1cm4gb2Zmc2V0O1xuXG4gICAgdmFyIF9wYXJlbnQkY2h1bmtCZWZvcmUgPSBwYXJlbnQuY2h1bmtCZWZvcmUob2Zmc2V0KTtcblxuICAgIHZhciBzdGFydCA9IF9wYXJlbnQkY2h1bmtCZWZvcmUuc3RhcnQ7XG4gICAgdmFyIG5vZGUgPSBfcGFyZW50JGNodW5rQmVmb3JlLm5vZGU7XG5cbiAgICBpZiAoIW5vZGUuaXNUZXh0KSByZXR1cm4gY2F0ID8gb2Zmc2V0IDogb2Zmc2V0IC0gMTtcblxuICAgIGlmIChieSA9PSBcImNoYXJcIikge1xuICAgICAgZm9yICh2YXIgaSA9IG9mZnNldCAtIHN0YXJ0OyBpID4gMDsgaS0tKSB7XG4gICAgICAgIGlmICghKDAsIF9jaGFyLmlzRXh0ZW5kaW5nQ2hhcikobm9kZS50ZXh0LmNoYXJBdChpIC0gMSkpKSByZXR1cm4gb2Zmc2V0IC0gMTtcbiAgICAgICAgb2Zmc2V0LS07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChieSA9PSBcIndvcmRcIikge1xuICAgICAgLy8gV29yayBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIGJhY2t3YXJkcyB0aHJvdWdoIHRleHQgb2YgYSBzaW5ndWxhclxuICAgICAgLy8gY2hhcmFjdGVyIGNhdGVnb3J5IChlLmcuIFwiY2F0XCIgb2YgXCIjISpcIikgdW50aWwgcmVhY2hpbmcgYSBjaGFyYWN0ZXIgaW4gYVxuICAgICAgLy8gZGlmZmVyZW50IGNhdGVnb3J5IChpLmUuIHRoZSBlbmQgb2YgdGhlIHdvcmQpLlxuICAgICAgZm9yICh2YXIgaSA9IG9mZnNldCAtIHN0YXJ0OyBpID4gMDsgaS0tKSB7XG4gICAgICAgIHZhciBuZXh0Q2hhckNhdCA9ICgwLCBfY2hhci5jaGFyQ2F0ZWdvcnkpKG5vZGUudGV4dC5jaGFyQXQoaSAtIDEpKTtcbiAgICAgICAgaWYgKGNhdCA9PSBudWxsIHx8IGNvdW50ZWQgPT0gMSAmJiBjYXQgPT0gXCJzcGFjZVwiKSBjYXQgPSBuZXh0Q2hhckNhdDtlbHNlIGlmIChjYXQgIT0gbmV4dENoYXJDYXQpIHJldHVybiBvZmZzZXQ7XG4gICAgICAgIG9mZnNldC0tO1xuICAgICAgICBjb3VudGVkKys7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbl9vcHRpb25zLmRlZmF1bHRSZWdpc3RyeS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xuICBuYW1lOiBcImRlbGV0ZVNlbGVjdGlvblwiLFxuICBsYWJlbDogXCJEZWxldGUgdGhlIHNlbGVjdGlvblwiLFxuICBydW46IGZ1bmN0aW9uIHJ1bihwbSkge1xuICAgIHJldHVybiBwbS50ci5yZXBsYWNlU2VsZWN0aW9uKCkuYXBwbHkoYW5kU2Nyb2xsKTtcbiAgfSxcbiAga2V5OiBbXCJCYWNrc3BhY2UoMTApXCIsIFwiRGVsZXRlKDEwKVwiLCBcIk1vZC1CYWNrc3BhY2UoMTApXCIsIFwiTW9kLURlbGV0ZSgxMClcIl0sXG4gIG1hY0tleTogW1wiQ3RybC1IKDEwKVwiLCBcIkFsdC1CYWNrc3BhY2UoMTApXCIsIFwiQ3RybC1EKDEwKVwiLCBcIkN0cmwtQWx0LUJhY2tzcGFjZSgxMClcIiwgXCJBbHQtRGVsZXRlKDEwKVwiLCBcIkFsdC1EKDEwKVwiXVxufSk7XG5cbmZ1bmN0aW9uIGRlbGV0ZUJhcnJpZXIocG0sIGN1dCkge1xuICB2YXIgYXJvdW5kID0gcG0uZG9jLnBhdGgoY3V0LnBhdGgpO1xuICB2YXIgYmVmb3JlID0gYXJvdW5kLmNoaWxkKGN1dC5vZmZzZXQgLSAxKSxcbiAgICAgIGFmdGVyID0gYXJvdW5kLmNoaWxkKGN1dC5vZmZzZXQpO1xuICBpZiAoYmVmb3JlLnR5cGUuY2FuQ29udGFpbkNvbnRlbnQoYWZ0ZXIudHlwZSkgJiYgcG0udHIuam9pbihjdXQpLmFwcGx5KGFuZFNjcm9sbCkgIT09IGZhbHNlKSByZXR1cm47XG5cbiAgdmFyIGNvbm4gPSB1bmRlZmluZWQ7XG4gIGlmIChhZnRlci5pc1RleHRibG9jayAmJiAoY29ubiA9IGJlZm9yZS50eXBlLmZpbmRDb25uZWN0aW9uKGFmdGVyLnR5cGUpKSkge1xuICAgIHZhciB0ciA9IHBtLnRyLFxuICAgICAgICBlbmQgPSBjdXQubW92ZSgxKTtcbiAgICB0ci5zdGVwKFwiYW5jZXN0b3JcIiwgY3V0LCBlbmQsIG51bGwsIHsgdHlwZXM6IFtiZWZvcmUudHlwZV0uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShjb25uKSksXG4gICAgICBhdHRyczogW2JlZm9yZS5hdHRyc10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShjb25uLm1hcChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSkpKSB9KTtcbiAgICB0ci5qb2luKGVuZCk7XG4gICAgdHIuam9pbihjdXQpO1xuICAgIGlmICh0ci5hcHBseShhbmRTY3JvbGwpICE9PSBmYWxzZSkgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHNlbEFmdGVyID0gKDAsIF9zZWxlY3Rpb24uZmluZFNlbGVjdGlvbkZyb20pKHBtLmRvYywgY3V0LCAxKTtcbiAgcmV0dXJuIHBtLnRyLmxpZnQoc2VsQWZ0ZXIuZnJvbSwgc2VsQWZ0ZXIudG8pLmFwcGx5KGFuZFNjcm9sbCk7XG59XG5cbl9vcHRpb25zLmRlZmF1bHRSZWdpc3RyeS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xuICBuYW1lOiBcImpvaW5CYWNrd2FyZFwiLFxuICBsYWJlbDogXCJKb2luIHdpdGggdGhlIGJsb2NrIGFib3ZlXCIsXG4gIHJ1bjogZnVuY3Rpb24gcnVuKHBtKSB7XG4gICAgdmFyIF9wbSRzZWxlY3Rpb240ID0gcG0uc2VsZWN0aW9uO1xuICAgIHZhciBoZWFkID0gX3BtJHNlbGVjdGlvbjQuaGVhZDtcbiAgICB2YXIgZW1wdHkgPSBfcG0kc2VsZWN0aW9uNC5lbXB0eTtcblxuICAgIGlmICghZW1wdHkgfHwgaGVhZC5vZmZzZXQgPiAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBGaW5kIHRoZSBub2RlIGJlZm9yZSB0aGlzIG9uZVxuICAgIHZhciBiZWZvcmUgPSB1bmRlZmluZWQsXG4gICAgICAgIGN1dCA9IHVuZGVmaW5lZDtcbiAgICBmb3IgKHZhciBpID0gaGVhZC5wYXRoLmxlbmd0aCAtIDE7ICFiZWZvcmUgJiYgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGlmIChoZWFkLnBhdGhbaV0gPiAwKSB7XG4gICAgICAgIGN1dCA9IGhlYWQuc2hvcnRlbihpKTtcbiAgICAgICAgYmVmb3JlID0gcG0uZG9jLnBhdGgoY3V0LnBhdGgpLmNoaWxkKGN1dC5vZmZzZXQgLSAxKTtcbiAgICAgIH1cbiAgICB9IC8vIElmIHRoZXJlIGlzIG5vIG5vZGUgYmVmb3JlIHRoaXMsIHRyeSB0byBsaWZ0XG4gICAgaWYgKCFiZWZvcmUpIHJldHVybiBwbS50ci5saWZ0KGhlYWQpLmFwcGx5KGFuZFNjcm9sbCk7XG5cbiAgICAvLyBJZiB0aGUgbm9kZSBkb2Vzbid0IGFsbG93IGNoaWxkcmVuLCBkZWxldGUgaXRcbiAgICBpZiAoYmVmb3JlLnR5cGUuY29udGFpbnMgPT0gbnVsbCkgcmV0dXJuIHBtLnRyW1wiZGVsZXRlXCJdKGN1dC5tb3ZlKC0xKSwgY3V0KS5hcHBseShhbmRTY3JvbGwpO1xuXG4gICAgLy8gQXBwbHkgdGhlIGpvaW5pbmcgYWxnb3JpdGhtXG4gICAgcmV0dXJuIGRlbGV0ZUJhcnJpZXIocG0sIGN1dCk7XG4gIH0sXG4gIGtleTogW1wiQmFja3NwYWNlKDMwKVwiLCBcIk1vZC1CYWNrc3BhY2UoMzApXCJdXG59KTtcblxuX29wdGlvbnMuZGVmYXVsdFJlZ2lzdHJ5LnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gIG5hbWU6IFwiZGVsZXRlQ2hhckJlZm9yZVwiLFxuICBsYWJlbDogXCJEZWxldGUgYSBjaGFyYWN0ZXIgYmVmb3JlIHRoZSBjdXJzb3JcIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICB2YXIgX3BtJHNlbGVjdGlvbjUgPSBwbS5zZWxlY3Rpb247XG4gICAgdmFyIGhlYWQgPSBfcG0kc2VsZWN0aW9uNS5oZWFkO1xuICAgIHZhciBlbXB0eSA9IF9wbSRzZWxlY3Rpb241LmVtcHR5O1xuXG4gICAgaWYgKCFlbXB0eSB8fCBoZWFkLm9mZnNldCA9PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIGZyb20gPSBtb3ZlQmFja3dhcmQocG0uZG9jLnBhdGgoaGVhZC5wYXRoKSwgaGVhZC5vZmZzZXQsIFwiY2hhclwiKTtcbiAgICByZXR1cm4gcG0udHJbXCJkZWxldGVcIl0obmV3IF9tb2RlbC5Qb3MoaGVhZC5wYXRoLCBmcm9tKSwgaGVhZCkuYXBwbHkoYW5kU2Nyb2xsKTtcbiAgfSxcbiAga2V5OiBcIkJhY2tzcGFjZSg2MClcIixcbiAgbWFjS2V5OiBcIkN0cmwtSCg0MClcIlxufSk7XG5cbl9vcHRpb25zLmRlZmF1bHRSZWdpc3RyeS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xuICBuYW1lOiBcImRlbGV0ZVdvcmRCZWZvcmVcIixcbiAgbGFiZWw6IFwiRGVsZXRlIHRoZSB3b3JkIGJlZm9yZSB0aGUgY3Vyc29yXCIsXG4gIHJ1bjogZnVuY3Rpb24gcnVuKHBtKSB7XG4gICAgdmFyIF9wbSRzZWxlY3Rpb242ID0gcG0uc2VsZWN0aW9uO1xuICAgIHZhciBoZWFkID0gX3BtJHNlbGVjdGlvbjYuaGVhZDtcbiAgICB2YXIgZW1wdHkgPSBfcG0kc2VsZWN0aW9uNi5lbXB0eTtcblxuICAgIGlmICghZW1wdHkgfHwgaGVhZC5vZmZzZXQgPT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBmcm9tID0gbW92ZUJhY2t3YXJkKHBtLmRvYy5wYXRoKGhlYWQucGF0aCksIGhlYWQub2Zmc2V0LCBcIndvcmRcIik7XG4gICAgcmV0dXJuIHBtLnRyW1wiZGVsZXRlXCJdKG5ldyBfbW9kZWwuUG9zKGhlYWQucGF0aCwgZnJvbSksIGhlYWQpLmFwcGx5KGFuZFNjcm9sbCk7XG4gIH0sXG4gIGtleTogXCJNb2QtQmFja3NwYWNlKDQwKVwiLFxuICBtYWNLZXk6IFwiQWx0LUJhY2tzcGFjZSg0MClcIlxufSk7XG5cbmZ1bmN0aW9uIG1vdmVGb3J3YXJkKHBhcmVudCwgb2Zmc2V0LCBieSkge1xuICBpZiAoYnkgIT0gXCJjaGFyXCIgJiYgYnkgIT0gXCJ3b3JkXCIpIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gbW90aW9uIHVuaXQ6IFwiICsgYnkpO1xuXG4gIHZhciBjYXQgPSBudWxsLFxuICAgICAgY291bnRlZCA9IDA7XG4gIGZvciAoOzspIHtcbiAgICBpZiAob2Zmc2V0ID09IHBhcmVudC5zaXplKSByZXR1cm4gb2Zmc2V0O1xuXG4gICAgdmFyIF9wYXJlbnQkY2h1bmtBZnRlciA9IHBhcmVudC5jaHVua0FmdGVyKG9mZnNldCk7XG5cbiAgICB2YXIgc3RhcnQgPSBfcGFyZW50JGNodW5rQWZ0ZXIuc3RhcnQ7XG4gICAgdmFyIG5vZGUgPSBfcGFyZW50JGNodW5rQWZ0ZXIubm9kZTtcblxuICAgIGlmICghbm9kZS5pc1RleHQpIHJldHVybiBjYXQgPyBvZmZzZXQgOiBvZmZzZXQgKyAxO1xuXG4gICAgaWYgKGJ5ID09IFwiY2hhclwiKSB7XG4gICAgICBmb3IgKHZhciBpID0gb2Zmc2V0IC0gc3RhcnQ7IGkgPCBub2RlLnRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCEoMCwgX2NoYXIuaXNFeHRlbmRpbmdDaGFyKShub2RlLnRleHQuY2hhckF0KGkgKyAxKSkpIHJldHVybiBvZmZzZXQgKyAxO1xuICAgICAgICBvZmZzZXQrKztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGJ5ID09IFwid29yZFwiKSB7XG4gICAgICBmb3IgKHZhciBpID0gb2Zmc2V0IC0gc3RhcnQ7IGkgPCBub2RlLnRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIG5leHRDaGFyQ2F0ID0gKDAsIF9jaGFyLmNoYXJDYXRlZ29yeSkobm9kZS50ZXh0LmNoYXJBdChpKSk7XG4gICAgICAgIGlmIChjYXQgPT0gbnVsbCB8fCBjb3VudGVkID09IDEgJiYgY2F0ID09IFwic3BhY2VcIikgY2F0ID0gbmV4dENoYXJDYXQ7ZWxzZSBpZiAoY2F0ICE9IG5leHRDaGFyQ2F0KSByZXR1cm4gb2Zmc2V0O1xuICAgICAgICBvZmZzZXQrKztcbiAgICAgICAgY291bnRlZCsrO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5fb3B0aW9ucy5kZWZhdWx0UmVnaXN0cnkucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcbiAgbmFtZTogXCJqb2luRm9yd2FyZFwiLFxuICBsYWJlbDogXCJKb2luIHdpdGggdGhlIGJsb2NrIGJlbG93XCIsXG4gIHJ1bjogZnVuY3Rpb24gcnVuKHBtKSB7XG4gICAgdmFyIF9wbSRzZWxlY3Rpb243ID0gcG0uc2VsZWN0aW9uO1xuICAgIHZhciBoZWFkID0gX3BtJHNlbGVjdGlvbjcuaGVhZDtcbiAgICB2YXIgZW1wdHkgPSBfcG0kc2VsZWN0aW9uNy5lbXB0eTtcblxuICAgIGlmICghZW1wdHkgfHwgaGVhZC5vZmZzZXQgPCBwbS5kb2MucGF0aChoZWFkLnBhdGgpLnNpemUpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIEZpbmQgdGhlIG5vZGUgYWZ0ZXIgdGhpcyBvbmVcbiAgICB2YXIgYWZ0ZXIgPSB1bmRlZmluZWQsXG4gICAgICAgIGN1dCA9IHVuZGVmaW5lZDtcbiAgICBmb3IgKHZhciBpID0gaGVhZC5wYXRoLmxlbmd0aCAtIDE7ICFhZnRlciAmJiBpID49IDA7IGktLSkge1xuICAgICAgY3V0ID0gaGVhZC5zaG9ydGVuKGksIDEpO1xuICAgICAgdmFyIF9wYXJlbnQgPSBwbS5kb2MucGF0aChjdXQucGF0aCk7XG4gICAgICBpZiAoY3V0Lm9mZnNldCA8IF9wYXJlbnQuc2l6ZSkgYWZ0ZXIgPSBfcGFyZW50LmNoaWxkKGN1dC5vZmZzZXQpO1xuICAgIH1cblxuICAgIC8vIElmIHRoZXJlIGlzIG5vIG5vZGUgYWZ0ZXIgdGhpcywgdGhlcmUncyBub3RoaW5nIHRvIGRvXG4gICAgaWYgKCFhZnRlcikgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gSWYgdGhlIG5vZGUgZG9lc24ndCBhbGxvdyBjaGlsZHJlbiwgZGVsZXRlIGl0XG4gICAgaWYgKGFmdGVyLnR5cGUuY29udGFpbnMgPT0gbnVsbCkgcmV0dXJuIHBtLnRyW1wiZGVsZXRlXCJdKGN1dCwgY3V0Lm1vdmUoMSkpLmFwcGx5KGFuZFNjcm9sbCk7XG5cbiAgICAvLyBBcHBseSB0aGUgam9pbmluZyBhbGdvcml0aG1cbiAgICByZXR1cm4gZGVsZXRlQmFycmllcihwbSwgY3V0KTtcbiAgfSxcbiAga2V5OiBbXCJEZWxldGUoMzApXCIsIFwiTW9kLURlbGV0ZSgzMClcIl1cbn0pO1xuXG5fb3B0aW9ucy5kZWZhdWx0UmVnaXN0cnkucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcbiAgbmFtZTogXCJkZWxldGVDaGFyQWZ0ZXJcIixcbiAgbGFiZWw6IFwiRGVsZXRlIGEgY2hhcmFjdGVyIGFmdGVyIHRoZSBjdXJzb3JcIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICB2YXIgX3BtJHNlbGVjdGlvbjggPSBwbS5zZWxlY3Rpb247XG4gICAgdmFyIGhlYWQgPSBfcG0kc2VsZWN0aW9uOC5oZWFkO1xuICAgIHZhciBlbXB0eSA9IF9wbSRzZWxlY3Rpb244LmVtcHR5O1xuXG4gICAgaWYgKCFlbXB0eSB8fCBoZWFkLm9mZnNldCA9PSBwbS5kb2MucGF0aChoZWFkLnBhdGgpLnNpemUpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgdG8gPSBtb3ZlRm9yd2FyZChwbS5kb2MucGF0aChoZWFkLnBhdGgpLCBoZWFkLm9mZnNldCwgXCJjaGFyXCIpO1xuICAgIHJldHVybiBwbS50cltcImRlbGV0ZVwiXShoZWFkLCBuZXcgX21vZGVsLlBvcyhoZWFkLnBhdGgsIHRvKSkuYXBwbHkoYW5kU2Nyb2xsKTtcbiAgfSxcbiAga2V5OiBcIkRlbGV0ZSg2MClcIixcbiAgbWFjS2V5OiBcIkN0cmwtRCg2MClcIlxufSk7XG5cbl9vcHRpb25zLmRlZmF1bHRSZWdpc3RyeS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xuICBuYW1lOiBcImRlbGV0ZVdvcmRBZnRlclwiLFxuICBsYWJlbDogXCJEZWxldGUgYSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGN1cnNvclwiLFxuICBydW46IGZ1bmN0aW9uIHJ1bihwbSkge1xuICAgIHZhciBfcG0kc2VsZWN0aW9uOSA9IHBtLnNlbGVjdGlvbjtcbiAgICB2YXIgaGVhZCA9IF9wbSRzZWxlY3Rpb245LmhlYWQ7XG4gICAgdmFyIGVtcHR5ID0gX3BtJHNlbGVjdGlvbjkuZW1wdHk7XG5cbiAgICBpZiAoIWVtcHR5IHx8IGhlYWQub2Zmc2V0ID09IHBtLmRvYy5wYXRoKGhlYWQucGF0aCkuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciB0byA9IG1vdmVGb3J3YXJkKHBtLmRvYy5wYXRoKGhlYWQucGF0aCksIGhlYWQub2Zmc2V0LCBcIndvcmRcIik7XG4gICAgcmV0dXJuIHBtLnRyW1wiZGVsZXRlXCJdKGhlYWQsIG5ldyBfbW9kZWwuUG9zKGhlYWQucGF0aCwgdG8pKS5hcHBseShhbmRTY3JvbGwpO1xuICB9LFxuICBrZXk6IFwiTW9kLURlbGV0ZSg0MClcIixcbiAgbWFjS2V5OiBbXCJDdHJsLUFsdC1CYWNrc3BhY2UoNDApXCIsIFwiQWx0LURlbGV0ZSg0MClcIiwgXCJBbHQtRCg0MClcIl1cbn0pO1xuXG5mdW5jdGlvbiBqb2luUG9pbnRBYm92ZShwbSkge1xuICB2YXIgX3BtJHNlbGVjdGlvbjEwID0gcG0uc2VsZWN0aW9uO1xuICB2YXIgbm9kZSA9IF9wbSRzZWxlY3Rpb24xMC5ub2RlO1xuICB2YXIgZnJvbSA9IF9wbSRzZWxlY3Rpb24xMC5mcm9tO1xuXG4gIGlmIChub2RlKSByZXR1cm4gKDAsIF90cmFuc2Zvcm0uam9pbmFibGVCbG9ja3MpKHBtLmRvYywgZnJvbSkgPyBmcm9tIDogbnVsbDtlbHNlIHJldHVybiAoMCwgX3RyYW5zZm9ybS5qb2luUG9pbnQpKHBtLmRvYywgZnJvbSwgLTEpO1xufVxuXG5fb3B0aW9ucy5kZWZhdWx0UmVnaXN0cnkucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcbiAgbmFtZTogXCJqb2luVXBcIixcbiAgbGFiZWw6IFwiSm9pbiB3aXRoIGFib3ZlIGJsb2NrXCIsXG4gIHJ1bjogZnVuY3Rpb24gcnVuKHBtKSB7XG4gICAgdmFyIG5vZGUgPSBwbS5zZWxlY3Rpb24ubm9kZTtcbiAgICB2YXIgcG9pbnQgPSBqb2luUG9pbnRBYm92ZShwbSk7XG4gICAgaWYgKCFwb2ludCkgcmV0dXJuIGZhbHNlO1xuICAgIHBtLnRyLmpvaW4ocG9pbnQpLmFwcGx5KCk7XG4gICAgaWYgKG5vZGUpIHBtLnNldE5vZGVTZWxlY3Rpb24ocG9pbnQubW92ZSgtMSkpO1xuICB9LFxuICBzZWxlY3Q6IGZ1bmN0aW9uIHNlbGVjdChwbSkge1xuICAgIHJldHVybiBqb2luUG9pbnRBYm92ZShwbSk7XG4gIH0sXG4gIG1lbnVHcm91cDogXCJibG9ja1wiLCBtZW51UmFuazogODAsXG4gIGljb246IHtcbiAgICB3aWR0aDogODAwLCBoZWlnaHQ6IDkwMCxcbiAgICBwYXRoOiBcIk0wIDc1aDgwMHYxMjVoLTgwMHogTTAgODI1aDgwMHYtMTI1aC04MDB6IE0yNTAgNDAwaDEwMHYtMTAwaDEwMHYxMDBoMTAwdjEwMGgtMTAwdjEwMGgtMTAwdi0xMDBoLTEwMHpcIlxuICB9LFxuICBrZXk6IFwiQWx0LVVwXCJcbn0pO1xuXG5mdW5jdGlvbiBqb2luUG9pbnRCZWxvdyhwbSkge1xuICB2YXIgX3BtJHNlbGVjdGlvbjExID0gcG0uc2VsZWN0aW9uO1xuICB2YXIgbm9kZSA9IF9wbSRzZWxlY3Rpb24xMS5ub2RlO1xuICB2YXIgdG8gPSBfcG0kc2VsZWN0aW9uMTEudG87XG5cbiAgaWYgKG5vZGUpIHJldHVybiAoMCwgX3RyYW5zZm9ybS5qb2luYWJsZUJsb2NrcykocG0uZG9jLCB0bykgPyB0byA6IG51bGw7ZWxzZSByZXR1cm4gKDAsIF90cmFuc2Zvcm0uam9pblBvaW50KShwbS5kb2MsIHRvLCAxKTtcbn1cblxuX29wdGlvbnMuZGVmYXVsdFJlZ2lzdHJ5LnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gIG5hbWU6IFwiam9pbkRvd25cIixcbiAgbGFiZWw6IFwiSm9pbiB3aXRoIGJlbG93IGJsb2NrXCIsXG4gIHJ1bjogZnVuY3Rpb24gcnVuKHBtKSB7XG4gICAgdmFyIG5vZGUgPSBwbS5zZWxlY3Rpb24ubm9kZTtcbiAgICB2YXIgcG9pbnQgPSBqb2luUG9pbnRCZWxvdyhwbSk7XG4gICAgaWYgKCFwb2ludCkgcmV0dXJuIGZhbHNlO1xuICAgIHBtLnRyLmpvaW4ocG9pbnQpLmFwcGx5KCk7XG4gICAgaWYgKG5vZGUpIHBtLnNldE5vZGVTZWxlY3Rpb24ocG9pbnQubW92ZSgtMSkpO1xuICB9LFxuICBzZWxlY3Q6IGZ1bmN0aW9uIHNlbGVjdChwbSkge1xuICAgIHJldHVybiBqb2luUG9pbnRCZWxvdyhwbSk7XG4gIH0sXG4gIGtleTogXCJBbHQtRG93blwiXG59KTtcblxuX29wdGlvbnMuZGVmYXVsdFJlZ2lzdHJ5LnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gIG5hbWU6IFwibGlmdFwiLFxuICBsYWJlbDogXCJMaWZ0IG91dCBvZiBlbmNsb3NpbmcgYmxvY2tcIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICB2YXIgX3BtJHNlbGVjdGlvbjEyID0gcG0uc2VsZWN0aW9uO1xuICAgIHZhciBmcm9tID0gX3BtJHNlbGVjdGlvbjEyLmZyb207XG4gICAgdmFyIHRvID0gX3BtJHNlbGVjdGlvbjEyLnRvO1xuXG4gICAgcmV0dXJuIHBtLnRyLmxpZnQoZnJvbSwgdG8pLmFwcGx5KGFuZFNjcm9sbCk7XG4gIH0sXG4gIHNlbGVjdDogZnVuY3Rpb24gc2VsZWN0KHBtKSB7XG4gICAgdmFyIF9wbSRzZWxlY3Rpb24xMyA9IHBtLnNlbGVjdGlvbjtcbiAgICB2YXIgZnJvbSA9IF9wbSRzZWxlY3Rpb24xMy5mcm9tO1xuICAgIHZhciB0byA9IF9wbSRzZWxlY3Rpb24xMy50bztcblxuICAgIHJldHVybiAoMCwgX3RyYW5zZm9ybS5jYW5MaWZ0KShwbS5kb2MsIGZyb20sIHRvKTtcbiAgfSxcbiAgbWVudUdyb3VwOiBcImJsb2NrXCIsIG1lbnVSYW5rOiA3NSxcbiAgaWNvbjoge1xuICAgIHdpZHRoOiAxMDI0LCBoZWlnaHQ6IDEwMjQsXG4gICAgcGF0aDogXCJNMjE5IDMxMHYzMjlxMCA3LTUgMTJ0LTEyIDVxLTggMC0xMy01bC0xNjQtMTY0cS01LTUtNS0xM3Q1LTEzbDE2NC0xNjRxNS01IDEzLTUgNyAwIDEyIDV0NSAxMnpNMTAyNCA3NDl2MTA5cTAgNy01IDEydC0xMiA1aC05ODdxLTcgMC0xMi01dC01LTEydi0xMDlxMC03IDUtMTJ0MTItNWg5ODdxNyAwIDEyIDV0NSAxMnpNMTAyNCA1MzB2MTA5cTAgNy01IDEydC0xMiA1aC02MjFxLTcgMC0xMi01dC01LTEydi0xMDlxMC03IDUtMTJ0MTItNWg2MjFxNyAwIDEyIDV0NSAxMnpNMTAyNCAzMTB2MTA5cTAgNy01IDEydC0xMiA1aC02MjFxLTcgMC0xMi01dC01LTEydi0xMDlxMC03IDUtMTJ0MTItNWg2MjFxNyAwIDEyIDV0NSAxMnpNMTAyNCA5MXYxMDlxMCA3LTUgMTJ0LTEyIDVoLTk4N3EtNyAwLTEyLTV0LTUtMTJ2LTEwOXEwLTcgNS0xMnQxMi01aDk4N3E3IDAgMTIgNXQ1IDEyelwiXG4gIH0sXG4gIGtleTogXCJBbHQtTGVmdFwiXG59KTtcblxuZnVuY3Rpb24gaXNBdFRvcE9mTGlzdEl0ZW0oZG9jLCBmcm9tLCB0bywgbGlzdFR5cGUpIHtcbiAgcmV0dXJuIF9tb2RlbC5Qb3Muc2FtZVBhdGgoZnJvbS5wYXRoLCB0by5wYXRoKSAmJiBmcm9tLnBhdGgubGVuZ3RoID49IDIgJiYgZnJvbS5wYXRoW2Zyb20ucGF0aC5sZW5ndGggLSAxXSA9PSAwICYmIGxpc3RUeXBlLmNhbkNvbnRhaW4oZG9jLnBhdGgoZnJvbS5wYXRoLnNsaWNlKDAsIGZyb20ucGF0aC5sZW5ndGggLSAxKSkpO1xufVxuXG5mdW5jdGlvbiB3cmFwQ29tbWFuZCh0eXBlLCBuYW1lLCBsYWJlbE5hbWUsIGlzTGlzdCwgc3BlYykge1xuICB2YXIgY29tbWFuZCA9IHtcbiAgICBuYW1lOiBcIndyYXBcIiArIG5hbWUsXG4gICAgbGFiZWw6IFwiV3JhcCBpbiBcIiArIGxhYmVsTmFtZSxcbiAgICBydW46IGZ1bmN0aW9uIHJ1bihwbSkge1xuICAgICAgdmFyIF9wbSRzZWxlY3Rpb24xNCA9IHBtLnNlbGVjdGlvbjtcbiAgICAgIHZhciBmcm9tID0gX3BtJHNlbGVjdGlvbjE0LmZyb207XG4gICAgICB2YXIgdG8gPSBfcG0kc2VsZWN0aW9uMTQudG87XG4gICAgICB2YXIgaGVhZCA9IF9wbSRzZWxlY3Rpb24xNC5oZWFkO3ZhciBkb0pvaW4gPSBmYWxzZTtcbiAgICAgIGlmIChpc0xpc3QgJiYgaGVhZCAmJiBpc0F0VG9wT2ZMaXN0SXRlbShwbS5kb2MsIGZyb20sIHRvLCB0aGlzKSkge1xuICAgICAgICAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiB0aGlzIGlzIHRoZSB0b3Agb2YgdGhlIGxpc3RcbiAgICAgICAgaWYgKGZyb20ucGF0aFtmcm9tLnBhdGgubGVuZ3RoIC0gMl0gPT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBkb0pvaW4gPSB0cnVlO1xuICAgICAgfVxuICAgICAgdmFyIHRyID0gcG0udHIud3JhcChmcm9tLCB0bywgdGhpcyk7XG4gICAgICBpZiAoZG9Kb2luKSB0ci5qb2luKGZyb20uc2hvcnRlbihmcm9tLmRlcHRoIC0gMikpO1xuICAgICAgcmV0dXJuIHRyLmFwcGx5KGFuZFNjcm9sbCk7XG4gICAgfSxcbiAgICBzZWxlY3Q6IGZ1bmN0aW9uIHNlbGVjdChwbSkge1xuICAgICAgdmFyIF9wbSRzZWxlY3Rpb24xNSA9IHBtLnNlbGVjdGlvbjtcbiAgICAgIHZhciBmcm9tID0gX3BtJHNlbGVjdGlvbjE1LmZyb207XG4gICAgICB2YXIgdG8gPSBfcG0kc2VsZWN0aW9uMTUudG87XG4gICAgICB2YXIgaGVhZCA9IF9wbSRzZWxlY3Rpb24xNS5oZWFkO1xuXG4gICAgICBpZiAoaXNMaXN0ICYmIGhlYWQgJiYgaXNBdFRvcE9mTGlzdEl0ZW0ocG0uZG9jLCBmcm9tLCB0bywgdGhpcykgJiYgZnJvbS5wYXRoW2Zyb20ucGF0aC5sZW5ndGggLSAyXSA9PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gKDAsIF90cmFuc2Zvcm0uY2FuV3JhcCkocG0uZG9jLCBmcm9tLCB0bywgdGhpcyk7XG4gICAgfVxuICB9O1xuICBmb3IgKHZhciBrZXkgaW4gc3BlYykge1xuICAgIGNvbW1hbmRba2V5XSA9IHNwZWNba2V5XTtcbiAgfXR5cGUucmVnaXN0ZXIoXCJjb21tYW5kXCIsIGNvbW1hbmQpO1xufVxuXG53cmFwQ29tbWFuZChfbW9kZWwuQnVsbGV0TGlzdCwgXCJCdWxsZXRMaXN0XCIsIFwiYnVsbGV0IGxpc3RcIiwgdHJ1ZSwge1xuICBtZW51R3JvdXA6IFwiYmxvY2tcIiwgbWVudVJhbms6IDQwLFxuICBpY29uOiB7XG4gICAgd2lkdGg6IDc2OCwgaGVpZ2h0OiA4OTYsXG4gICAgcGF0aDogXCJNMCA1MTJoMTI4di0xMjhoLTEyOHYxMjh6TTAgMjU2aDEyOHYtMTI4aC0xMjh2MTI4ek0wIDc2OGgxMjh2LTEyOGgtMTI4djEyOHpNMjU2IDUxMmg1MTJ2LTEyOGgtNTEydjEyOHpNMjU2IDI1Nmg1MTJ2LTEyOGgtNTEydjEyOHpNMjU2IDc2OGg1MTJ2LTEyOGgtNTEydjEyOHpcIlxuICB9LFxuICBrZXk6IFtcIkFsdC1SaWdodCAnKidcIiwgXCJBbHQtUmlnaHQgJy0nXCJdXG59KTtcblxud3JhcENvbW1hbmQoX21vZGVsLk9yZGVyZWRMaXN0LCBcIk9yZGVyZWRMaXN0XCIsIFwib3JkZXJlZCBsaXN0XCIsIHRydWUsIHtcbiAgbWVudUdyb3VwOiBcImJsb2NrXCIsIG1lbnVSYW5rOiA0MSxcbiAgaWNvbjoge1xuICAgIHdpZHRoOiA3NjgsIGhlaWdodDogODk2LFxuICAgIHBhdGg6IFwiTTMyMCA1MTJoNDQ4di0xMjhoLTQ0OHYxMjh6TTMyMCA3NjhoNDQ4di0xMjhoLTQ0OHYxMjh6TTMyMCAxMjh2MTI4aDQ0OHYtMTI4aC00NDh6TTc5IDM4NGg3OHYtMjU2aC0zNmwtODUgMjN2NTBsNDMtMnYxODV6TTE4OSA1OTBjMC0zNi0xMi03OC05Ni03OC0zMyAwLTY0IDYtODMgMTZsMSA2NmMyMS0xMCA0Mi0xNSA2Ny0xNXMzMiAxMSAzMiAyOGMwIDI2LTMwIDU4LTExMCAxMTJ2NTBoMTkydi02N2wtOTEgMmM0OS0zMCA4Ny02NiA4Ny0xMTNsMS0xelwiXG4gIH0sXG4gIGtleTogXCJBbHQtUmlnaHQgJzEnXCJcbn0pO1xuXG53cmFwQ29tbWFuZChfbW9kZWwuQmxvY2tRdW90ZSwgXCJCbG9ja1F1b3RlXCIsIFwiYmxvY2sgcXVvdGVcIiwgZmFsc2UsIHtcbiAgbWVudUdyb3VwOiBcImJsb2NrXCIsIG1lbnVSYW5rOiA0NSxcbiAgaWNvbjoge1xuICAgIHdpZHRoOiA2NDAsIGhlaWdodDogODk2LFxuICAgIHBhdGg6IFwiTTAgNDQ4djI1NmgyNTZ2LTI1NmgtMTI4YzAgMCAwLTEyOCAxMjgtMTI4di0xMjhjMCAwLTI1NiAwLTI1NiAyNTZ6TTY0MCAzMjB2LTEyOGMwIDAtMjU2IDAtMjU2IDI1NnYyNTZoMjU2di0yNTZoLTEyOGMwIDAgMC0xMjggMTI4LTEyOHpcIlxuICB9LFxuICBrZXk6IFtcIkFsdC1SaWdodCAnPidcIiwgXCJBbHQtUmlnaHQgJ1xcXCInXCJdXG59KTtcblxuX29wdGlvbnMuZGVmYXVsdFJlZ2lzdHJ5LnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gIG5hbWU6IFwibmV3bGluZUluQ29kZVwiLFxuICBsYWJlbDogXCJJbnNlcnQgbmV3bGluZVwiLFxuICBydW46IGZ1bmN0aW9uIHJ1bihwbSkge1xuICAgIHZhciBfcG0kc2VsZWN0aW9uMTYgPSBwbS5zZWxlY3Rpb247XG4gICAgdmFyIGZyb20gPSBfcG0kc2VsZWN0aW9uMTYuZnJvbTtcbiAgICB2YXIgdG8gPSBfcG0kc2VsZWN0aW9uMTYudG87XG4gICAgdmFyIG5vZGUgPSBfcG0kc2VsZWN0aW9uMTYubm9kZTt2YXIgYmxvY2sgPSB1bmRlZmluZWQ7XG4gICAgaWYgKCFub2RlICYmIF9tb2RlbC5Qb3Muc2FtZVBhdGgoZnJvbS5wYXRoLCB0by5wYXRoKSAmJiAoYmxvY2sgPSBwbS5kb2MucGF0aChmcm9tLnBhdGgpKS50eXBlLmlzQ29kZSAmJiB0by5vZmZzZXQgPCBibG9jay5zaXplKSByZXR1cm4gcG0udHIudHlwZVRleHQoXCJcXG5cIikuYXBwbHkoYW5kU2Nyb2xsKTtlbHNlIHJldHVybiBmYWxzZTtcbiAgfSxcbiAga2V5OiBcIkVudGVyKDEwKVwiXG59KTtcblxuX29wdGlvbnMuZGVmYXVsdFJlZ2lzdHJ5LnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gIG5hbWU6IFwiY3JlYXRlUGFyYWdyYXBoTmVhclwiLFxuICBsYWJlbDogXCJDcmVhdGUgYSBwYXJhZ3JhcGggbmVhciB0aGUgc2VsZWN0ZWQgbGVhZiBibG9ja1wiLFxuICBydW46IGZ1bmN0aW9uIHJ1bihwbSkge1xuICAgIHZhciBfcG0kc2VsZWN0aW9uMTcgPSBwbS5zZWxlY3Rpb247XG4gICAgdmFyIGZyb20gPSBfcG0kc2VsZWN0aW9uMTcuZnJvbTtcbiAgICB2YXIgdG8gPSBfcG0kc2VsZWN0aW9uMTcudG87XG4gICAgdmFyIG5vZGUgPSBfcG0kc2VsZWN0aW9uMTcubm9kZTtcblxuICAgIGlmICghbm9kZSB8fCAhbm9kZS5pc0Jsb2NrIHx8IG5vZGUudHlwZS5jb250YWlucykgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBzaWRlID0gZnJvbS5vZmZzZXQgPyB0byA6IGZyb207XG4gICAgcG0udHIuaW5zZXJ0KHNpZGUsIHBtLnNjaGVtYS5kZWZhdWx0VGV4dGJsb2NrVHlwZSgpLmNyZWF0ZSgpKS5hcHBseShhbmRTY3JvbGwpO1xuICAgIHBtLnNldFRleHRTZWxlY3Rpb24obmV3IF9tb2RlbC5Qb3Moc2lkZS50b1BhdGgoKSwgMCkpO1xuICB9LFxuICBrZXk6IFwiRW50ZXIoMjApXCJcbn0pO1xuXG5fb3B0aW9ucy5kZWZhdWx0UmVnaXN0cnkucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcbiAgbmFtZTogXCJsaWZ0RW1wdHlCbG9ja1wiLFxuICBsYWJlbDogXCJNb3ZlIGN1cnJlbnQgYmxvY2sgdXBcIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICB2YXIgX3BtJHNlbGVjdGlvbjE4ID0gcG0uc2VsZWN0aW9uO1xuICAgIHZhciBoZWFkID0gX3BtJHNlbGVjdGlvbjE4LmhlYWQ7XG4gICAgdmFyIGVtcHR5ID0gX3BtJHNlbGVjdGlvbjE4LmVtcHR5O1xuXG4gICAgaWYgKCFlbXB0eSB8fCBoZWFkLm9mZnNldCA+IDAgfHwgcG0uZG9jLnBhdGgoaGVhZC5wYXRoKS5zaXplKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGhlYWQuZGVwdGggPiAxKSB7XG4gICAgICB2YXIgc2hvcnRlciA9IGhlYWQuc2hvcnRlbigpO1xuICAgICAgaWYgKHNob3J0ZXIub2Zmc2V0ID4gMCAmJiBzaG9ydGVyLm9mZnNldCA8IHBtLmRvYy5wYXRoKHNob3J0ZXIucGF0aCkuc2l6ZSAtIDEgJiYgcG0udHIuc3BsaXQoc2hvcnRlcikuYXBwbHkoKSAhPT0gZmFsc2UpIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIHBtLnRyLmxpZnQoaGVhZCkuYXBwbHkoYW5kU2Nyb2xsKTtcbiAgfSxcbiAga2V5OiBcIkVudGVyKDMwKVwiXG59KTtcblxuX29wdGlvbnMuZGVmYXVsdFJlZ2lzdHJ5LnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gIG5hbWU6IFwic3BsaXRCbG9ja1wiLFxuICBsYWJlbDogXCJTcGxpdCB0aGUgY3VycmVudCBibG9ja1wiLFxuICBydW46IGZ1bmN0aW9uIHJ1bihwbSkge1xuICAgIHZhciBfcG0kc2VsZWN0aW9uMTkgPSBwbS5zZWxlY3Rpb247XG4gICAgdmFyIGZyb20gPSBfcG0kc2VsZWN0aW9uMTkuZnJvbTtcbiAgICB2YXIgdG8gPSBfcG0kc2VsZWN0aW9uMTkudG87XG4gICAgdmFyIG5vZGUgPSBfcG0kc2VsZWN0aW9uMTkubm9kZTt2YXIgYmxvY2sgPSBwbS5kb2MucGF0aCh0by5wYXRoKTtcbiAgICBpZiAobm9kZSAmJiBub2RlLmlzQmxvY2spIHtcbiAgICAgIGlmICghZnJvbS5vZmZzZXQpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiBwbS50ci5zcGxpdChmcm9tKS5hcHBseShhbmRTY3JvbGwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgdHlwZSA9IHRvLm9mZnNldCA9PSBibG9jay5zaXplID8gcG0uc2NoZW1hLmRlZmF1bHRUZXh0YmxvY2tUeXBlKCkgOiBudWxsO1xuICAgICAgcmV0dXJuIHBtLnRyW1wiZGVsZXRlXCJdKGZyb20sIHRvKS5zcGxpdChmcm9tLCAxLCB0eXBlKS5hcHBseShhbmRTY3JvbGwpO1xuICAgIH1cbiAgfSxcbiAga2V5OiBcIkVudGVyKDYwKVwiXG59KTtcblxuX21vZGVsLkxpc3RJdGVtLnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gIG5hbWU6IFwic3BsaXRMaXN0SXRlbVwiLFxuICBsYWJlbDogXCJTcGxpdCB0aGUgY3VycmVudCBsaXN0IGl0ZW1cIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICB2YXIgX3BtJHNlbGVjdGlvbjIwID0gcG0uc2VsZWN0aW9uO1xuICAgIHZhciBmcm9tID0gX3BtJHNlbGVjdGlvbjIwLmZyb207XG4gICAgdmFyIHRvID0gX3BtJHNlbGVjdGlvbjIwLnRvO1xuICAgIHZhciBub2RlID0gX3BtJHNlbGVjdGlvbjIwLm5vZGU7XG5cbiAgICBpZiAobm9kZSAmJiBub2RlLmlzQmxvY2sgfHwgZnJvbS5wYXRoLmxlbmd0aCA8IDIgfHwgIV9tb2RlbC5Qb3Muc2FtZVBhdGgoZnJvbS5wYXRoLCB0by5wYXRoKSkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciB0b1BhcmVudCA9IGZyb20uc2hvcnRlbigpLFxuICAgICAgICBncmFuZFBhcmVudCA9IHBtLmRvYy5wYXRoKHRvUGFyZW50LnBhdGgpO1xuICAgIGlmIChncmFuZFBhcmVudC50eXBlICE9IHRoaXMpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgbmV4dFR5cGUgPSB0by5vZmZzZXQgPT0gZ3JhbmRQYXJlbnQuY2hpbGQodG9QYXJlbnQub2Zmc2V0KS5zaXplID8gcG0uc2NoZW1hLmRlZmF1bHRUZXh0YmxvY2tUeXBlKCkgOiBudWxsO1xuICAgIHJldHVybiBwbS50cltcImRlbGV0ZVwiXShmcm9tLCB0bykuc3BsaXQoZnJvbSwgMiwgbmV4dFR5cGUpLmFwcGx5KGFuZFNjcm9sbCk7XG4gIH0sXG4gIGtleTogXCJFbnRlcig1MClcIlxufSk7XG5cbmZ1bmN0aW9uIGFscmVhZHlIYXNCbG9ja1R5cGUoZG9jLCBmcm9tLCB0bywgdHlwZSwgYXR0cnMpIHtcbiAgdmFyIGZvdW5kID0gZmFsc2U7XG4gIGlmICghYXR0cnMpIGF0dHJzID0ge307XG4gIGRvYy5ub2Rlc0JldHdlZW4oZnJvbSwgdG8gfHwgZnJvbSwgZnVuY3Rpb24gKG5vZGUpIHtcbiAgICBpZiAobm9kZS5pc1RleHRibG9jaykge1xuICAgICAgaWYgKG5vZGUuaGFzTWFya3VwKHR5cGUsIGF0dHJzKSkgZm91bmQgPSB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBmb3VuZDtcbn1cblxuZnVuY3Rpb24gYmxvY2tUeXBlQ29tbWFuZCh0eXBlLCBuYW1lLCBsYWJlbE5hbWUsIGF0dHJzLCBrZXkpIHtcbiAgaWYgKCFhdHRycykgYXR0cnMgPSB7fTtcbiAgdHlwZS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xuICAgIG5hbWU6IG5hbWUsXG4gICAgbGFiZWw6IFwiQ2hhbmdlIHRvIFwiICsgbGFiZWxOYW1lLFxuICAgIHJ1bjogZnVuY3Rpb24gcnVuKHBtKSB7XG4gICAgICB2YXIgX3BtJHNlbGVjdGlvbjIxID0gcG0uc2VsZWN0aW9uO1xuICAgICAgdmFyIGZyb20gPSBfcG0kc2VsZWN0aW9uMjEuZnJvbTtcbiAgICAgIHZhciB0byA9IF9wbSRzZWxlY3Rpb24yMS50bztcblxuICAgICAgcmV0dXJuIHBtLnRyLnNldEJsb2NrVHlwZShmcm9tLCB0bywgdGhpcywgYXR0cnMpLmFwcGx5KGFuZFNjcm9sbCk7XG4gICAgfSxcbiAgICBzZWxlY3Q6IGZ1bmN0aW9uIHNlbGVjdChwbSkge1xuICAgICAgdmFyIF9wbSRzZWxlY3Rpb24yMiA9IHBtLnNlbGVjdGlvbjtcbiAgICAgIHZhciBmcm9tID0gX3BtJHNlbGVjdGlvbjIyLmZyb207XG4gICAgICB2YXIgdG8gPSBfcG0kc2VsZWN0aW9uMjIudG87XG4gICAgICB2YXIgbm9kZSA9IF9wbSRzZWxlY3Rpb24yMi5ub2RlO1xuXG4gICAgICBpZiAobm9kZSkgcmV0dXJuIG5vZGUuaXNUZXh0YmxvY2sgJiYgIW5vZGUuaGFzTWFya3VwKHRoaXMsIGF0dHJzKTtlbHNlIHJldHVybiAhYWxyZWFkeUhhc0Jsb2NrVHlwZShwbS5kb2MsIGZyb20sIHRvLCB0aGlzLCBhdHRycyk7XG4gICAgfSxcbiAgICBrZXk6IGtleVxuICB9KTtcbn1cblxuYmxvY2tUeXBlQ29tbWFuZChfbW9kZWwuSGVhZGluZywgXCJtYWtlSDFcIiwgXCJoZWFkaW5nIDFcIiwgeyBsZXZlbDogMSB9LCBcIk1vZC1IICcxJ1wiKTtcbmJsb2NrVHlwZUNvbW1hbmQoX21vZGVsLkhlYWRpbmcsIFwibWFrZUgyXCIsIFwiaGVhZGluZyAyXCIsIHsgbGV2ZWw6IDIgfSwgXCJNb2QtSCAnMidcIik7XG5ibG9ja1R5cGVDb21tYW5kKF9tb2RlbC5IZWFkaW5nLCBcIm1ha2VIM1wiLCBcImhlYWRpbmcgM1wiLCB7IGxldmVsOiAzIH0sIFwiTW9kLUggJzMnXCIpO1xuYmxvY2tUeXBlQ29tbWFuZChfbW9kZWwuSGVhZGluZywgXCJtYWtlSDRcIiwgXCJoZWFkaW5nIDRcIiwgeyBsZXZlbDogNCB9LCBcIk1vZC1IICc0J1wiKTtcbmJsb2NrVHlwZUNvbW1hbmQoX21vZGVsLkhlYWRpbmcsIFwibWFrZUg1XCIsIFwiaGVhZGluZyA1XCIsIHsgbGV2ZWw6IDUgfSwgXCJNb2QtSCAnNSdcIik7XG5ibG9ja1R5cGVDb21tYW5kKF9tb2RlbC5IZWFkaW5nLCBcIm1ha2VINlwiLCBcImhlYWRpbmcgNlwiLCB7IGxldmVsOiA2IH0sIFwiTW9kLUggJzYnXCIpO1xuXG5ibG9ja1R5cGVDb21tYW5kKF9tb2RlbC5QYXJhZ3JhcGgsIFwibWFrZVBhcmFncmFwaFwiLCBcInBhcmFncmFwaFwiLCBudWxsLCBcIk1vZC1QXCIpO1xuYmxvY2tUeXBlQ29tbWFuZChfbW9kZWwuQ29kZUJsb2NrLCBcIm1ha2VDb2RlQmxvY2tcIiwgXCJjb2RlIGJsb2NrXCIsIG51bGwsIFwiTW9kLVxcXFxcIik7XG5cbl9tb2RlbC5Ib3Jpem9udGFsUnVsZS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xuICBuYW1lOiBcImluc2VydEhvcml6b250YWxSdWxlXCIsXG4gIGxhYmVsOiBcIkluc2VydCBob3Jpem9udGFsIHJ1bGVcIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICByZXR1cm4gcG0udHIucmVwbGFjZVNlbGVjdGlvbih0aGlzLmNyZWF0ZSgpKS5hcHBseShhbmRTY3JvbGwpO1xuICB9LFxuICBrZXk6IFwiTW9kLVNwYWNlXCJcbn0pO1xuXG5fb3B0aW9ucy5kZWZhdWx0UmVnaXN0cnkucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcbiAgbmFtZTogXCJ1bmRvXCIsXG4gIGxhYmVsOiBcIlVuZG8gbGFzdCBjaGFuZ2VcIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICBwbS5zY3JvbGxJbnRvVmlldygpO3JldHVybiBwbS5oaXN0b3J5LnVuZG8oKTtcbiAgfSxcbiAgc2VsZWN0OiBmdW5jdGlvbiBzZWxlY3QocG0pIHtcbiAgICByZXR1cm4gcG0uaGlzdG9yeS5jYW5VbmRvKCk7XG4gIH0sXG4gIG1lbnVHcm91cDogXCJoaXN0b3J5XCIsIG1lbnVSYW5rOiAxMCxcbiAgaWNvbjoge1xuICAgIHdpZHRoOiAxMDI0LCBoZWlnaHQ6IDEwMjQsXG4gICAgcGF0aDogXCJNNzYxIDEwMjRjMTEzLTIwNiAxMzItNTIwLTMxMy01MDl2MjUzbC0zODQtMzg0IDM4NC0zODR2MjQ4YzUzNC0xMyA1OTQgNDcyIDMxMyA3NzV6XCJcbiAgfSxcbiAga2V5OiBcIk1vZC1aXCJcbn0pO1xuXG5fb3B0aW9ucy5kZWZhdWx0UmVnaXN0cnkucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcbiAgbmFtZTogXCJyZWRvXCIsXG4gIGxhYmVsOiBcIlJlZG8gbGFzdCB1bmRvbmUgY2hhbmdlXCIsXG4gIHJ1bjogZnVuY3Rpb24gcnVuKHBtKSB7XG4gICAgcG0uc2Nyb2xsSW50b1ZpZXcoKTtyZXR1cm4gcG0uaGlzdG9yeS5yZWRvKCk7XG4gIH0sXG4gIHNlbGVjdDogZnVuY3Rpb24gc2VsZWN0KHBtKSB7XG4gICAgcmV0dXJuIHBtLmhpc3RvcnkuY2FuUmVkbygpO1xuICB9LFxuICBtZW51R3JvdXA6IFwiaGlzdG9yeVwiLCBtZW51UmFuazogMjAsXG4gIGljb246IHtcbiAgICB3aWR0aDogMTAyNCwgaGVpZ2h0OiAxMDI0LFxuICAgIHBhdGg6IFwiTTU3NiAyNDh2LTI0OGwzODQgMzg0LTM4NCAzODR2LTI1M2MtNDQ2LTEwLTQyNyAzMDMtMzEzIDUwOS0yODAtMzAzLTIyMS03ODkgMzEzLTc3NXpcIlxuICB9LFxuICBrZXk6IFtcIk1vZC1ZXCIsIFwiU2hpZnQtTW9kLVpcIl1cbn0pO1xuXG5fb3B0aW9ucy5kZWZhdWx0UmVnaXN0cnkucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcbiAgbmFtZTogXCJ0ZXh0YmxvY2tUeXBlXCIsXG4gIGxhYmVsOiBcIkNoYW5nZSBibG9jayB0eXBlXCIsXG4gIHJ1bjogZnVuY3Rpb24gcnVuKHBtLCB0eXBlKSB7XG4gICAgdmFyIF9wbSRzZWxlY3Rpb24yMyA9IHBtLnNlbGVjdGlvbjtcbiAgICB2YXIgZnJvbSA9IF9wbSRzZWxlY3Rpb24yMy5mcm9tO1xuICAgIHZhciB0byA9IF9wbSRzZWxlY3Rpb24yMy50bztcblxuICAgIHJldHVybiBwbS50ci5zZXRCbG9ja1R5cGUoZnJvbSwgdG8sIHR5cGUudHlwZSwgdHlwZS5hdHRycykuYXBwbHkoKTtcbiAgfSxcbiAgc2VsZWN0OiBmdW5jdGlvbiBzZWxlY3QocG0pIHtcbiAgICB2YXIgbm9kZSA9IHBtLnNlbGVjdGlvbi5ub2RlO1xuXG4gICAgcmV0dXJuICFub2RlIHx8IG5vZGUuaXNUZXh0YmxvY2s7XG4gIH0sXG4gIHBhcmFtczogW3sgbGFiZWw6IFwiVHlwZVwiLCB0eXBlOiBcInNlbGVjdFwiLCBvcHRpb25zOiBsaXN0VGV4dGJsb2NrVHlwZXMsIFwiZGVmYXVsdFwiOiBjdXJyZW50VGV4dGJsb2NrVHlwZSwgZGVmYXVsdExhYmVsOiBcIlR5cGUuLi5cIiB9XSxcbiAgZGlzcGxheTogXCJzZWxlY3RcIixcbiAgbWVudUdyb3VwOiBcImJsb2NrXCIsIG1lbnVSYW5rOiAxMFxufSk7XG5cbl9tb2RlbC5QYXJhZ3JhcGgucHJvdG90eXBlLnRleHRibG9ja1R5cGVzID0gW3sgbGFiZWw6IFwiTm9ybWFsXCIsIHJhbms6IDEwIH1dO1xuX21vZGVsLkNvZGVCbG9jay5wcm90b3R5cGUudGV4dGJsb2NrVHlwZXMgPSBbeyBsYWJlbDogXCJDb2RlXCIsIHJhbms6IDIwIH1dO1xuX21vZGVsLkhlYWRpbmcucHJvdG90eXBlLnRleHRibG9ja1R5cGVzID0gWzEsIDIsIDMsIDQsIDUsIDZdLm1hcChmdW5jdGlvbiAobikge1xuICByZXR1cm4geyBsYWJlbDogXCJIZWFkIFwiICsgbiwgYXR0cnM6IHsgbGV2ZWw6IG4gfSwgcmFuazogMzAgKyBuIH07XG59KTtcblxuZnVuY3Rpb24gbGlzdFRleHRibG9ja1R5cGVzKHBtKSB7XG4gIHZhciBjYWNoZWQgPSBwbS5zY2hlbWEuY2FjaGVkLnRleHRibG9ja1R5cGVzO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gIHZhciBmb3VuZCA9IFtdO1xuICBmb3IgKHZhciBfbmFtZTMgaW4gcG0uc2NoZW1hLm5vZGVzKSB7XG4gICAgdmFyIHR5cGUgPSBwbS5zY2hlbWEubm9kZXNbX25hbWUzXTtcbiAgICBpZiAoIXR5cGUudGV4dGJsb2NrVHlwZXMpIGNvbnRpbnVlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHlwZS50ZXh0YmxvY2tUeXBlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGluZm8gPSB0eXBlLnRleHRibG9ja1R5cGVzW2ldO1xuICAgICAgKDAsIF91dGlsU29ydGVkaW5zZXJ0MltcImRlZmF1bHRcIl0pKGZvdW5kLCB7IGxhYmVsOiBpbmZvLmxhYmVsLCB2YWx1ZTogeyB0eXBlOiB0eXBlLCBhdHRyczogaW5mby5hdHRycyB9LCByYW5rOiBpbmZvLnJhbmsgfSwgZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIGEucmFuayAtIGIucmFuaztcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcG0uc2NoZW1hLmNhY2hlZC50ZXh0YmxvY2tUeXBlcyA9IGZvdW5kO1xufVxuXG5mdW5jdGlvbiBjdXJyZW50VGV4dGJsb2NrVHlwZShwbSkge1xuICB2YXIgX3BtJHNlbGVjdGlvbjI0ID0gcG0uc2VsZWN0aW9uO1xuICB2YXIgZnJvbSA9IF9wbSRzZWxlY3Rpb24yNC5mcm9tO1xuICB2YXIgdG8gPSBfcG0kc2VsZWN0aW9uMjQudG87XG4gIHZhciBub2RlID0gX3BtJHNlbGVjdGlvbjI0Lm5vZGU7XG5cbiAgaWYgKCFub2RlIHx8IG5vZGUuaXNJbmxpbmUpIHtcbiAgICBpZiAoIV9tb2RlbC5Qb3Muc2FtZVBhdGgoZnJvbS5wYXRoLCB0by5wYXRoKSkgcmV0dXJuIG51bGw7XG4gICAgbm9kZSA9IHBtLmRvYy5wYXRoKGZyb20ucGF0aCk7XG4gIH0gZWxzZSBpZiAoIW5vZGUuaXNUZXh0YmxvY2spIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2YXIgdHlwZXMgPSBsaXN0VGV4dGJsb2NrVHlwZXMocG0pO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHRwID0gdHlwZXNbaV0sXG4gICAgICAgIHZhbCA9IHRwLnZhbHVlO1xuICAgIGlmIChub2RlLmhhc01hcmt1cCh2YWwudHlwZSwgdmFsLmF0dHJzKSkgcmV0dXJuIHRwO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vZGVBYm92ZVNlbGVjdGlvbihwbSkge1xuICB2YXIgc2VsID0gcG0uc2VsZWN0aW9uLFxuICAgICAgaSA9IDA7XG4gIGlmIChzZWwubm9kZSkgcmV0dXJuICEhc2VsLmZyb20uZGVwdGggJiYgc2VsLmZyb20uc2hvcnRlbigpO1xuICBmb3IgKDsgaSA8IHNlbC5oZWFkLmRlcHRoICYmIGkgPCBzZWwuYW5jaG9yLmRlcHRoOyBpKyspIGlmIChzZWwuaGVhZC5wYXRoW2ldICE9IHNlbC5hbmNob3IucGF0aFtpXSkgYnJlYWs7XG4gIHJldHVybiBpID09IDAgPyBmYWxzZSA6IHNlbC5oZWFkLnNob3J0ZW4oaSAtIDEpO1xufVxuXG5fb3B0aW9ucy5kZWZhdWx0UmVnaXN0cnkucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcbiAgbmFtZTogXCJzZWxlY3RQYXJlbnRCbG9ja1wiLFxuICBsYWJlbDogXCJTZWxlY3QgcGFyZW50IG5vZGVcIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICB2YXIgbm9kZSA9IG5vZGVBYm92ZVNlbGVjdGlvbihwbSk7XG4gICAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG4gICAgcG0uc2V0Tm9kZVNlbGVjdGlvbihub2RlKTtcbiAgfSxcbiAgc2VsZWN0OiBmdW5jdGlvbiBzZWxlY3QocG0pIHtcbiAgICByZXR1cm4gbm9kZUFib3ZlU2VsZWN0aW9uKHBtKTtcbiAgfSxcbiAgbWVudUdyb3VwOiBcImJsb2NrXCIsIG1lbnVSYW5rOiA5MCxcbiAgaWNvbjogeyB0ZXh0OiBcIuKsmlwiLCBzdHlsZTogXCJmb250LXdlaWdodDogYm9sZDsgdmVydGljYWwtYWxpZ246IDIwJVwiIH0sXG4gIGtleTogXCJFc2NcIlxufSk7XG5cbmZ1bmN0aW9uIG1vdmVTZWxlY3Rpb25CbG9jayhwbSwgZGlyKSB7XG4gIHZhciBfcG0kc2VsZWN0aW9uMjUgPSBwbS5zZWxlY3Rpb247XG4gIHZhciBmcm9tID0gX3BtJHNlbGVjdGlvbjI1LmZyb207XG4gIHZhciB0byA9IF9wbSRzZWxlY3Rpb24yNS50bztcbiAgdmFyIG5vZGUgPSBfcG0kc2VsZWN0aW9uMjUubm9kZTtcblxuICB2YXIgc2lkZSA9IGRpciA+IDAgPyB0byA6IGZyb207XG4gIHJldHVybiAoMCwgX3NlbGVjdGlvbi5maW5kU2VsZWN0aW9uRnJvbSkocG0uZG9jLCBub2RlICYmIG5vZGUuaXNCbG9jayA/IHNpZGUgOiBzaWRlLnNob3J0ZW4obnVsbCwgZGlyID4gMCA/IDEgOiAwKSwgZGlyKTtcbn1cblxuZnVuY3Rpb24gc2VsZWN0QmxvY2tIb3Jpem9udGFsbHkocG0sIGRpcikge1xuICB2YXIgX3BtJHNlbGVjdGlvbjI2ID0gcG0uc2VsZWN0aW9uO1xuICB2YXIgZW1wdHkgPSBfcG0kc2VsZWN0aW9uMjYuZW1wdHk7XG4gIHZhciBub2RlID0gX3BtJHNlbGVjdGlvbjI2Lm5vZGU7XG4gIHZhciBmcm9tID0gX3BtJHNlbGVjdGlvbjI2LmZyb207XG4gIHZhciB0byA9IF9wbSRzZWxlY3Rpb24yNi50bztcblxuICBpZiAoIWVtcHR5ICYmICFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUgJiYgbm9kZS5pc0lubGluZSkge1xuICAgIHBtLnNldFRleHRTZWxlY3Rpb24oZGlyID4gMCA/IHRvIDogZnJvbSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB2YXIgcGFyZW50ID0gdW5kZWZpbmVkO1xuICBpZiAoIW5vZGUgJiYgKHBhcmVudCA9IHBtLmRvYy5wYXRoKGZyb20ucGF0aCkpICYmIChkaXIgPiAwID8gZnJvbS5vZmZzZXQgPCBwYXJlbnQuc2l6ZSA6IGZyb20ub2Zmc2V0KSkge1xuICAgIHZhciBfcmVmID0gZGlyID4gMCA/IHBhcmVudC5jaHVua0FmdGVyKGZyb20ub2Zmc2V0KSA6IHBhcmVudC5jaHVua0JlZm9yZShmcm9tLm9mZnNldCk7XG5cbiAgICB2YXIgbmV4dE5vZGUgPSBfcmVmLm5vZGU7XG4gICAgdmFyIHN0YXJ0ID0gX3JlZi5zdGFydDtcblxuICAgIGlmIChuZXh0Tm9kZS50eXBlLnNlbGVjdGFibGUgJiYgc3RhcnQgPT0gZnJvbS5vZmZzZXQgLSAoZGlyID4gMCA/IDAgOiAxKSkge1xuICAgICAgcG0uc2V0Tm9kZVNlbGVjdGlvbihkaXIgPCAwID8gZnJvbS5tb3ZlKC0xKSA6IGZyb20pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBuZXh0ID0gbW92ZVNlbGVjdGlvbkJsb2NrKHBtLCBkaXIpO1xuICBpZiAobmV4dCAmJiAobmV4dCBpbnN0YW5jZW9mIF9zZWxlY3Rpb24uTm9kZVNlbGVjdGlvbiB8fCBub2RlKSkge1xuICAgIHBtLnNldFNlbGVjdGlvbkRpcmVjdChuZXh0KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbl9vcHRpb25zLmRlZmF1bHRSZWdpc3RyeS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xuICBuYW1lOiBcInNlbGVjdEJsb2NrTGVmdFwiLFxuICBsYWJlbDogXCJNb3ZlIHRoZSBzZWxlY3Rpb24gb250byBvciBvdXQgb2YgdGhlIGJsb2NrIHRvIHRoZSBsZWZ0XCIsXG4gIHJ1bjogZnVuY3Rpb24gcnVuKHBtKSB7XG4gICAgdmFyIGRvbmUgPSBzZWxlY3RCbG9ja0hvcml6b250YWxseShwbSwgLTEpO1xuICAgIGlmIChkb25lKSBwbS5zY3JvbGxJbnRvVmlldygpO1xuICAgIHJldHVybiBkb25lO1xuICB9LFxuICBrZXk6IFtcIkxlZnRcIiwgXCJNb2QtTGVmdFwiXVxufSk7XG5cbl9vcHRpb25zLmRlZmF1bHRSZWdpc3RyeS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xuICBuYW1lOiBcInNlbGVjdEJsb2NrUmlnaHRcIixcbiAgbGFiZWw6IFwiTW92ZSB0aGUgc2VsZWN0aW9uIG9udG8gb3Igb3V0IG9mIHRoZSBibG9jayB0byB0aGUgcmlnaHRcIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICB2YXIgZG9uZSA9IHNlbGVjdEJsb2NrSG9yaXpvbnRhbGx5KHBtLCAxKTtcbiAgICBpZiAoZG9uZSkgcG0uc2Nyb2xsSW50b1ZpZXcoKTtcbiAgICByZXR1cm4gZG9uZTtcbiAgfSxcbiAga2V5OiBbXCJSaWdodFwiLCBcIk1vZC1SaWdodFwiXVxufSk7XG5cbmZ1bmN0aW9uIHNlbGVjdEJsb2NrVmVydGljYWxseShwbSwgZGlyKSB7XG4gIHZhciBfcG0kc2VsZWN0aW9uMjcgPSBwbS5zZWxlY3Rpb247XG4gIHZhciBlbXB0eSA9IF9wbSRzZWxlY3Rpb24yNy5lbXB0eTtcbiAgdmFyIG5vZGUgPSBfcG0kc2VsZWN0aW9uMjcubm9kZTtcbiAgdmFyIGZyb20gPSBfcG0kc2VsZWN0aW9uMjcuZnJvbTtcbiAgdmFyIHRvID0gX3BtJHNlbGVjdGlvbjI3LnRvO1xuXG4gIGlmICghZW1wdHkgJiYgIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICB2YXIgbGVhdmluZ1RleHRibG9jayA9IHRydWU7XG4gIGlmICghbm9kZSB8fCBub2RlLmlzSW5saW5lKSBsZWF2aW5nVGV4dGJsb2NrID0gKDAsIF9zZWxlY3Rpb24udmVydGljYWxNb3Rpb25MZWF2ZXNUZXh0YmxvY2spKHBtLCBkaXIgPiAwID8gdG8gOiBmcm9tLCBkaXIpO1xuXG4gIGlmIChsZWF2aW5nVGV4dGJsb2NrKSB7XG4gICAgdmFyIG5leHQgPSBtb3ZlU2VsZWN0aW9uQmxvY2socG0sIGRpcik7XG4gICAgaWYgKG5leHQgJiYgbmV4dCBpbnN0YW5jZW9mIF9zZWxlY3Rpb24uTm9kZVNlbGVjdGlvbikge1xuICAgICAgcG0uc2V0U2VsZWN0aW9uRGlyZWN0KG5leHQpO1xuICAgICAgaWYgKCFub2RlKSBwbS5zZWwubGFzdE5vbk5vZGVQb3MgPSBmcm9tO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUuaXNJbmxpbmUpIHtcbiAgICAoMCwgX3NlbGVjdGlvbi5zZXRET01TZWxlY3Rpb25Ub1BvcykocG0sIGZyb20pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBsYXN0ID0gcG0uc2VsLmxhc3ROb25Ob2RlUG9zO1xuICB2YXIgYmV5b25kID0gKDAsIF9zZWxlY3Rpb24uZmluZFNlbGVjdGlvbkZyb20pKHBtLmRvYywgZGlyIDwgMCA/IGZyb20gOiB0bywgZGlyKTtcbiAgaWYgKGxhc3QgJiYgYmV5b25kICYmIF9tb2RlbC5Qb3Muc2FtZVBhdGgobGFzdC5wYXRoLCBiZXlvbmQuZnJvbS5wYXRoKSkge1xuICAgICgwLCBfc2VsZWN0aW9uLnNldERPTVNlbGVjdGlvblRvUG9zKShwbSwgbGFzdCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHBtLnNldFNlbGVjdGlvbkRpcmVjdChiZXlvbmQpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuX29wdGlvbnMuZGVmYXVsdFJlZ2lzdHJ5LnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gIG5hbWU6IFwic2VsZWN0QmxvY2tVcFwiLFxuICBsYWJlbDogXCJNb3ZlIHRoZSBzZWxlY3Rpb24gb250byBvciBvdXQgb2YgdGhlIGJsb2NrIGFib3ZlXCIsXG4gIHJ1bjogZnVuY3Rpb24gcnVuKHBtKSB7XG4gICAgdmFyIGRvbmUgPSBzZWxlY3RCbG9ja1ZlcnRpY2FsbHkocG0sIC0xKTtcbiAgICBpZiAoZG9uZSAhPT0gZmFsc2UpIHBtLnNjcm9sbEludG9WaWV3KCk7XG4gICAgcmV0dXJuIGRvbmU7XG4gIH0sXG4gIGtleTogXCJVcFwiXG59KTtcblxuX29wdGlvbnMuZGVmYXVsdFJlZ2lzdHJ5LnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gIG5hbWU6IFwic2VsZWN0QmxvY2tEb3duXCIsXG4gIGxhYmVsOiBcIk1vdmUgdGhlIHNlbGVjdGlvbiBvbnRvIG9yIG91dCBvZiB0aGUgYmxvY2sgYmVsb3dcIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICB2YXIgZG9uZSA9IHNlbGVjdEJsb2NrVmVydGljYWxseShwbSwgMSk7XG4gICAgaWYgKGRvbmUgIT09IGZhbHNlKSBwbS5zY3JvbGxJbnRvVmlldygpO1xuICAgIHJldHVybiBkb25lO1xuICB9LFxuICBrZXk6IFwiRG93blwiXG59KTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9kb20gPSByZXF1aXJlKFwiLi4vZG9tXCIpO1xuXG4oMCwgX2RvbS5pbnNlcnRDU1MpKFwiXFxuXFxuLlByb3NlTWlycm9yIHtcXG4gIGJvcmRlcjogMXB4IHNvbGlkIHNpbHZlcjtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG59XFxuXFxuLlByb3NlTWlycm9yLWNvbnRlbnQge1xcbiAgcGFkZGluZzogNHB4IDhweCA0cHggMTRweDtcXG4gIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjI7XFxufVxcblxcbi5Qcm9zZU1pcnJvci1kcm9wLXRhcmdldCB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICB3aWR0aDogMXB4O1xcbiAgYmFja2dyb3VuZDogIzY2NjtcXG4gIGRpc3BsYXk6IG5vbmU7XFxufVxcblxcbi5Qcm9zZU1pcnJvci1jb250ZW50IHVsLnRpZ2h0IHAsIC5Qcm9zZU1pcnJvci1jb250ZW50IG9sLnRpZ2h0IHAge1xcbiAgbWFyZ2luOiAwO1xcbn1cXG5cXG4uUHJvc2VNaXJyb3ItY29udGVudCB1bCwgLlByb3NlTWlycm9yLWNvbnRlbnQgb2wge1xcbiAgcGFkZGluZy1sZWZ0OiAzMHB4O1xcbiAgY3Vyc29yOiBkZWZhdWx0O1xcbn1cXG5cXG4uUHJvc2VNaXJyb3ItY29udGVudCBibG9ja3F1b3RlIHtcXG4gIHBhZGRpbmctbGVmdDogMWVtO1xcbiAgYm9yZGVyLWxlZnQ6IDNweCBzb2xpZCAjZWVlO1xcbiAgbWFyZ2luLWxlZnQ6IDA7IG1hcmdpbi1yaWdodDogMDtcXG59XFxuXFxuLlByb3NlTWlycm9yLWNvbnRlbnQgcHJlIHtcXG4gIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcXG59XFxuXFxuLlByb3NlTWlycm9yLXNlbGVjdGVkbm9kZSB7XFxuICBvdXRsaW5lOiAycHggc29saWQgIzhjZjtcXG59XFxuXFxuLlByb3NlTWlycm9yLWNvbnRlbnQgcDpmaXJzdC1jaGlsZCxcXG4uUHJvc2VNaXJyb3ItY29udGVudCBoMTpmaXJzdC1jaGlsZCxcXG4uUHJvc2VNaXJyb3ItY29udGVudCBoMjpmaXJzdC1jaGlsZCxcXG4uUHJvc2VNaXJyb3ItY29udGVudCBoMzpmaXJzdC1jaGlsZCxcXG4uUHJvc2VNaXJyb3ItY29udGVudCBoNDpmaXJzdC1jaGlsZCxcXG4uUHJvc2VNaXJyb3ItY29udGVudCBoNTpmaXJzdC1jaGlsZCxcXG4uUHJvc2VNaXJyb3ItY29udGVudCBoNjpmaXJzdC1jaGlsZCB7XFxuICBtYXJnaW4tdG9wOiAuM2VtO1xcbn1cXG5cXG4vKiBBZGQgc3BhY2UgYXJvdW5kIHRoZSBociB0byBtYWtlIGNsaWNraW5nIGl0IGVhc2llciAqL1xcblxcbi5Qcm9zZU1pcnJvci1jb250ZW50IGhyIHtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIGhlaWdodDogNnB4O1xcbiAgYm9yZGVyOiBub25lO1xcbn1cXG5cXG4uUHJvc2VNaXJyb3ItY29udGVudCBocjphZnRlciB7XFxuICBjb250ZW50OiBcXFwiXFxcIjtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGxlZnQ6IDEwcHg7XFxuICByaWdodDogMTBweDtcXG4gIHRvcDogMnB4O1xcbiAgYm9yZGVyLXRvcDogMnB4IHNvbGlkIHNpbHZlcjtcXG59XFxuXFxuLlByb3NlTWlycm9yLWNvbnRlbnQgaW1nIHtcXG4gIGN1cnNvcjogZGVmYXVsdDtcXG59XFxuXFxuLyogTWFrZSBzdXJlIGxpIHNlbGVjdGlvbnMgd3JhcCBhcm91bmQgbWFya2VycyAqL1xcblxcbi5Qcm9zZU1pcnJvci1jb250ZW50IGxpIHtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lOyAvKiBEb24ndCBkbyB3ZWlyZCBzdHVmZiB3aXRoIG1hcmtlciBjbGlja3MgKi9cXG59XFxuLlByb3NlTWlycm9yLWNvbnRlbnQgbGkgPiAqIHtcXG4gIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xcbn1cXG5cXG5saS5Qcm9zZU1pcnJvci1zZWxlY3RlZG5vZGUge1xcbiAgb3V0bGluZTogbm9uZTtcXG59XFxuXFxubGkuUHJvc2VNaXJyb3Itc2VsZWN0ZWRub2RlOmFmdGVyIHtcXG4gIGNvbnRlbnQ6IFxcXCJcXFwiO1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgbGVmdDogLTMycHg7XFxuICByaWdodDogLTJweDsgdG9wOiAtMnB4OyBib3R0b206IC0ycHg7XFxuICBib3JkZXI6IDJweCBzb2xpZCAjOGNmO1xcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxufVxcblxcblwiKTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuYXBwbHlET01DaGFuZ2UgPSBhcHBseURPTUNoYW5nZTtcbmV4cG9ydHMudGV4dENvbnRleHQgPSB0ZXh0Q29udGV4dDtcbmV4cG9ydHMudGV4dEluQ29udGV4dCA9IHRleHRJbkNvbnRleHQ7XG5cbnZhciBfbW9kZWwgPSByZXF1aXJlKFwiLi4vbW9kZWxcIik7XG5cbnZhciBfcGFyc2VEb20gPSByZXF1aXJlKFwiLi4vcGFyc2UvZG9tXCIpO1xuXG52YXIgX3RyYW5zZm9ybVRyZWUgPSByZXF1aXJlKFwiLi4vdHJhbnNmb3JtL3RyZWVcIik7XG5cbnZhciBfc2VsZWN0aW9uID0gcmVxdWlyZShcIi4vc2VsZWN0aW9uXCIpO1xuXG5mdW5jdGlvbiBpc0F0RW5kKG5vZGUsIHBvcywgZGVwdGgpIHtcbiAgZm9yICh2YXIgaSA9IGRlcHRoIHx8IDA7IGkgPCBwb3MucGF0aC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBuID0gcG9zLnBhdGhbZGVwdGhdO1xuICAgIGlmIChuIDwgbm9kZS5zaXplIC0gMSkgcmV0dXJuIGZhbHNlO1xuICAgIG5vZGUgPSBub2RlLmNoaWxkKG4pO1xuICB9XG4gIHJldHVybiBwb3Mub2Zmc2V0ID09IG5vZGUuc2l6ZTtcbn1cbmZ1bmN0aW9uIGlzQXRTdGFydChwb3MsIGRlcHRoKSB7XG4gIGlmIChwb3Mub2Zmc2V0ID4gMCkgcmV0dXJuIGZhbHNlO1xuICBmb3IgKHZhciBpID0gZGVwdGggfHwgMDsgaSA8IHBvcy5wYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHBvcy5wYXRoW2RlcHRoXSA+IDApIHJldHVybiBmYWxzZTtcbiAgfXJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBwYXJzZU5lYXJTZWxlY3Rpb24ocG0pIHtcbiAgdmFyIGRvbSA9IHBtLmNvbnRlbnQsXG4gICAgICBub2RlID0gcG0uZG9jO1xuICB2YXIgX3BtJHNlbGVjdGlvbiA9IHBtLnNlbGVjdGlvbjtcbiAgdmFyIGZyb20gPSBfcG0kc2VsZWN0aW9uLmZyb207XG4gIHZhciB0byA9IF9wbSRzZWxlY3Rpb24udG87XG5cbiAgZm9yICh2YXIgZGVwdGggPSAwOzsgZGVwdGgrKykge1xuICAgIHZhciB0b05vZGUgPSBub2RlLmNoaWxkKHRvLnBhdGhbZGVwdGhdKTtcbiAgICB2YXIgZnJvbVN0YXJ0ID0gaXNBdFN0YXJ0KGZyb20sIGRlcHRoICsgMSk7XG4gICAgdmFyIHRvRW5kID0gaXNBdEVuZCh0b05vZGUsIHRvLCBkZXB0aCArIDEpO1xuICAgIGlmIChmcm9tU3RhcnQgfHwgdG9FbmQgfHwgZnJvbS5wYXRoW2RlcHRoXSAhPSB0by5wYXRoW2RlcHRoXSB8fCB0b05vZGUuaXNUZXh0YmxvY2spIHtcbiAgICAgIHZhciBzdGFydE9mZnNldCA9IGRlcHRoID09IGZyb20uZGVwdGggPyBmcm9tLm9mZnNldCA6IGZyb20ucGF0aFtkZXB0aF07XG4gICAgICBpZiAoZnJvbVN0YXJ0ICYmIHN0YXJ0T2Zmc2V0ID4gMCkgc3RhcnRPZmZzZXQtLTtcbiAgICAgIHZhciBlbmRPZmZzZXQgPSBkZXB0aCA9PSB0by5kZXB0aCA/IHRvLm9mZnNldCA6IHRvLnBhdGhbZGVwdGhdICsgMTtcbiAgICAgIGlmICh0b0VuZCAmJiBlbmRPZmZzZXQgPCBub2RlLnNpemUgLSAxKSBlbmRPZmZzZXQrKztcbiAgICAgIHZhciBwYXJzZWQgPSAoMCwgX3BhcnNlRG9tLmZyb21ET00pKHBtLnNjaGVtYSwgZG9tLCB7IHRvcE5vZGU6IG5vZGUuY29weSgpLFxuICAgICAgICBmcm9tOiBzdGFydE9mZnNldCxcbiAgICAgICAgdG86IGRvbS5jaGlsZE5vZGVzLmxlbmd0aCAtIChub2RlLnNpemUgLSBlbmRPZmZzZXQpIH0pO1xuICAgICAgcGFyc2VkID0gcGFyc2VkLmNvcHkobm9kZS5jb250ZW50LnNsaWNlKDAsIHN0YXJ0T2Zmc2V0KS5hcHBlbmQocGFyc2VkLmNvbnRlbnQpLmFwcGVuZChub2RlLmNvbnRlbnQuc2xpY2UoZW5kT2Zmc2V0KSkpO1xuICAgICAgZm9yICh2YXIgaSA9IGRlcHRoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdmFyIHdyYXAgPSBwbS5kb2MucGF0aChmcm9tLnBhdGguc2xpY2UoMCwgaSkpO1xuICAgICAgICBwYXJzZWQgPSB3cmFwLnJlcGxhY2UoZnJvbS5wYXRoW2ldLCBwYXJzZWQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICB9XG4gICAgbm9kZSA9IHRvTm9kZTtcbiAgICBkb20gPSAoMCwgX3NlbGVjdGlvbi5maW5kQnlQYXRoKShkb20sIGZyb20ucGF0aFtkZXB0aF0sIGZhbHNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhcHBseURPTUNoYW5nZShwbSkge1xuICB2YXIgdXBkYXRlZCA9IHBhcnNlTmVhclNlbGVjdGlvbihwbSk7XG4gIHZhciBjaGFuZ2VTdGFydCA9ICgwLCBfbW9kZWwuZmluZERpZmZTdGFydCkocG0uZG9jLmNvbnRlbnQsIHVwZGF0ZWQuY29udGVudCk7XG4gIGlmIChjaGFuZ2VTdGFydCkge1xuICAgIHZhciBjaGFuZ2VFbmQgPSBmaW5kRGlmZkVuZENvbnN0cmFpbmVkKHBtLmRvYy5jb250ZW50LCB1cGRhdGVkLmNvbnRlbnQsIGNoYW5nZVN0YXJ0KTtcbiAgICAvLyBNYXJrIG5vZGVzIHRvdWNoZWQgYnkgdGhpcyBjaGFuZ2UgYXMgJ3RvIGJlIHJlZHJhd24nXG4gICAgcG0ubWFya1JhbmdlRGlydHkocG0uZG9jLnNpYmxpbmdSYW5nZShjaGFuZ2VTdGFydCwgY2hhbmdlRW5kLmEpKTtcblxuICAgIHBtLnRyLnJlcGxhY2UoY2hhbmdlU3RhcnQsIGNoYW5nZUVuZC5hLCB1cGRhdGVkLCBjaGFuZ2VTdGFydCwgY2hhbmdlRW5kLmIpLmFwcGx5KCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIG9mZnNldEJ5KGZpcnN0LCBzZWNvbmQsIHBvcykge1xuICB2YXIgc2FtZSA9ICgwLCBfdHJhbnNmb3JtVHJlZS5zYW1lUGF0aERlcHRoKShmaXJzdCwgc2Vjb25kKTtcbiAgdmFyIGZpcnN0RW5kID0gc2FtZSA9PSBmaXJzdC5kZXB0aCxcbiAgICAgIHNlY29uZEVuZCA9IHNhbWUgPT0gc2Vjb25kLmRlcHRoO1xuICB2YXIgb2ZmID0gKHNlY29uZEVuZCA/IHNlY29uZC5vZmZzZXQgOiBzZWNvbmQucGF0aFtzYW1lXSkgLSAoZmlyc3RFbmQgPyBmaXJzdC5vZmZzZXQgOiBmaXJzdC5wYXRoW3NhbWVdKTtcbiAgdmFyIHNob3J0ZXIgPSBmaXJzdEVuZCA/IHBvcy5tb3ZlKG9mZikgOiBwb3Muc2hvcnRlbihzYW1lLCBvZmYpO1xuICBpZiAoc2Vjb25kRW5kKSByZXR1cm4gc2hvcnRlcjtlbHNlIHJldHVybiBzaG9ydGVyLmV4dGVuZChuZXcgX21vZGVsLlBvcyhzZWNvbmQucGF0aC5zbGljZShzYW1lKSwgc2Vjb25kLm9mZnNldCkpO1xufVxuXG5mdW5jdGlvbiBmaW5kRGlmZkVuZENvbnN0cmFpbmVkKGEsIGIsIHN0YXJ0KSB7XG4gIHZhciBlbmQgPSAoMCwgX21vZGVsLmZpbmREaWZmRW5kKShhLCBiKTtcbiAgaWYgKCFlbmQpIHJldHVybiBlbmQ7XG4gIGlmIChlbmQuYS5jbXAoc3RhcnQpIDwgMCkgcmV0dXJuIHsgYTogc3RhcnQsIGI6IG9mZnNldEJ5KGVuZC5hLCBzdGFydCwgZW5kLmIpIH07XG4gIGlmIChlbmQuYi5jbXAoc3RhcnQpIDwgMCkgcmV0dXJuIHsgYTogb2Zmc2V0QnkoZW5kLmIsIHN0YXJ0LCBlbmQuYSksIGI6IHN0YXJ0IH07XG4gIHJldHVybiBlbmQ7XG59XG5cbi8vIFRleHQtb25seSBxdWVyaWVzIGZvciBjb21wb3NpdGlvbiBldmVudHNcblxuZnVuY3Rpb24gdGV4dENvbnRleHQoZGF0YSkge1xuICB2YXIgcmFuZ2UgPSBnZXRTZWxlY3Rpb24oKS5nZXRSYW5nZUF0KDApO1xuICB2YXIgc3RhcnQgPSByYW5nZS5zdGFydENvbnRhaW5lcixcbiAgICAgIGVuZCA9IHJhbmdlLmVuZENvbnRhaW5lcjtcbiAgaWYgKHN0YXJ0ID09IGVuZCAmJiBzdGFydC5ub2RlVHlwZSA9PSAzKSB7XG4gICAgdmFyIHZhbHVlID0gc3RhcnQubm9kZVZhbHVlLFxuICAgICAgICBsZWFkID0gcmFuZ2Uuc3RhcnRPZmZzZXQsXG4gICAgICAgIF9lbmQgPSByYW5nZS5lbmRPZmZzZXQ7XG4gICAgaWYgKGRhdGEgJiYgX2VuZCA+PSBkYXRhLmxlbmd0aCAmJiB2YWx1ZS5zbGljZShfZW5kIC0gZGF0YS5sZW5ndGgsIF9lbmQpID09IGRhdGEpIGxlYWQgPSBfZW5kIC0gZGF0YS5sZW5ndGg7XG4gICAgcmV0dXJuIHsgaW5zaWRlOiBzdGFydCwgbGVhZDogbGVhZCwgdHJhaWw6IHZhbHVlLmxlbmd0aCAtIF9lbmQgfTtcbiAgfVxuXG4gIHZhciBzaXplQmVmb3JlID0gbnVsbCxcbiAgICAgIHNpemVBZnRlciA9IG51bGw7XG4gIHZhciBiZWZvcmUgPSBzdGFydC5jaGlsZE5vZGVzW3JhbmdlLnN0YXJ0T2Zmc2V0IC0gMV0gfHwgbm9kZUJlZm9yZShzdGFydCk7XG4gIHdoaWxlIChiZWZvcmUubGFzdENoaWxkKSBiZWZvcmUgPSBiZWZvcmUubGFzdENoaWxkO1xuICBpZiAoYmVmb3JlICYmIGJlZm9yZS5ub2RlVHlwZSA9PSAzKSB7XG4gICAgdmFyIHZhbHVlID0gYmVmb3JlLm5vZGVWYWx1ZTtcbiAgICBzaXplQmVmb3JlID0gdmFsdWUubGVuZ3RoO1xuICAgIGlmIChkYXRhICYmIHZhbHVlLnNsaWNlKHZhbHVlLmxlbmd0aCAtIGRhdGEubGVuZ3RoKSA9PSBkYXRhKSBzaXplQmVmb3JlIC09IGRhdGEubGVuZ3RoO1xuICB9XG4gIHZhciBhZnRlciA9IGVuZC5jaGlsZE5vZGVzW3JhbmdlLmVuZE9mZnNldF0gfHwgbm9kZUFmdGVyKGVuZCk7XG4gIHdoaWxlIChhZnRlci5maXJzdENoaWxkKSBhZnRlciA9IGFmdGVyLmZpcnN0Q2hpbGQ7XG4gIGlmIChhZnRlciAmJiBhZnRlci5ub2RlVHlwZSA9PSAzKSBzaXplQWZ0ZXIgPSBhZnRlci5ub2RlVmFsdWUubGVuZ3RoO1xuXG4gIHJldHVybiB7IGJlZm9yZTogYmVmb3JlLCBzaXplQmVmb3JlOiBzaXplQmVmb3JlLFxuICAgIGFmdGVyOiBhZnRlciwgc2l6ZUFmdGVyOiBzaXplQWZ0ZXIgfTtcbn1cblxuZnVuY3Rpb24gdGV4dEluQ29udGV4dChjb250ZXh0LCBkZWZsdCkge1xuICBpZiAoY29udGV4dC5pbnNpZGUpIHtcbiAgICB2YXIgX3ZhbCA9IGNvbnRleHQuaW5zaWRlLm5vZGVWYWx1ZTtcbiAgICByZXR1cm4gX3ZhbC5zbGljZShjb250ZXh0LmxlYWQsIF92YWwubGVuZ3RoIC0gY29udGV4dC50cmFpbCk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGJlZm9yZSA9IGNvbnRleHQuYmVmb3JlLFxuICAgICAgICBhZnRlciA9IGNvbnRleHQuYWZ0ZXIsXG4gICAgICAgIHZhbCA9IFwiXCI7XG4gICAgaWYgKCFiZWZvcmUpIHJldHVybiBkZWZsdDtcbiAgICBpZiAoYmVmb3JlLm5vZGVUeXBlID09IDMpIHZhbCA9IGJlZm9yZS5ub2RlVmFsdWUuc2xpY2UoY29udGV4dC5zaXplQmVmb3JlKTtcbiAgICB2YXIgc2NhbiA9IHNjYW5UZXh0KGJlZm9yZSwgYWZ0ZXIpO1xuICAgIGlmIChzY2FuID09IG51bGwpIHJldHVybiBkZWZsdDtcbiAgICB2YWwgKz0gc2NhbjtcbiAgICBpZiAoYWZ0ZXIgJiYgYWZ0ZXIubm9kZVR5cGUgPT0gMykge1xuICAgICAgdmFyIHZhbEFmdGVyID0gYWZ0ZXIubm9kZVZhbHVlO1xuICAgICAgdmFsICs9IHZhbEFmdGVyLnNsaWNlKDAsIHZhbEFmdGVyLmxlbmd0aCAtIGNvbnRleHQuc2l6ZUFmdGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBub2RlQWZ0ZXIobm9kZSkge1xuICBmb3IgKDs7KSB7XG4gICAgdmFyIG5leHQgPSBub2RlLm5leHRTaWJsaW5nO1xuICAgIGlmIChuZXh0KSB7XG4gICAgICB3aGlsZSAobmV4dC5maXJzdENoaWxkKSBuZXh0ID0gbmV4dC5maXJzdENoaWxkO1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfVxuICAgIGlmICghKG5vZGUgPSBub2RlLnBhcmVudEVsZW1lbnQpKSByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBub2RlQmVmb3JlKG5vZGUpIHtcbiAgZm9yICg7Oykge1xuICAgIHZhciBwcmV2ID0gbm9kZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgaWYgKHByZXYpIHtcbiAgICAgIHdoaWxlIChwcmV2Lmxhc3RDaGlsZCkgcHJldiA9IHByZXYubGFzdENoaWxkO1xuICAgICAgcmV0dXJuIHByZXY7XG4gICAgfVxuICAgIGlmICghKG5vZGUgPSBub2RlLnBhcmVudEVsZW1lbnQpKSByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBzY2FuVGV4dChzdGFydCwgZW5kKSB7XG4gIHZhciB0ZXh0ID0gXCJcIixcbiAgICAgIGN1ciA9IG5vZGVBZnRlcihzdGFydCk7XG4gIGZvciAoOzspIHtcbiAgICBpZiAoY3VyID09IGVuZCkgcmV0dXJuIHRleHQ7XG4gICAgaWYgKCFjdXIpIHJldHVybiBudWxsO1xuICAgIGlmIChjdXIubm9kZVR5cGUgPT0gMykgdGV4dCArPSBjdXIubm9kZVZhbHVlO1xuICAgIGN1ciA9IGN1ci5maXJzdENoaWxkIHx8IG5vZGVBZnRlcihjdXIpO1xuICB9XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRyYXcgPSBkcmF3O1xuZXhwb3J0cy5yZWRyYXcgPSByZWRyYXc7XG5cbnZhciBfbW9kZWwgPSByZXF1aXJlKFwiLi4vbW9kZWxcIik7XG5cbnZhciBfc2VyaWFsaXplRG9tID0gcmVxdWlyZShcIi4uL3NlcmlhbGl6ZS9kb21cIik7XG5cbnZhciBfZG9tID0gcmVxdWlyZShcIi4uL2RvbVwiKTtcblxudmFyIF9tYWluID0gcmVxdWlyZShcIi4vbWFpblwiKTtcblxuLy8gRklYTUUgY2xlYW4gdXAgdGhyZWFkaW5nIG9mIHBhdGggYW5kIG9mZnNldCwgbWF5YmUgcmVtb3ZlIGZyb20gRE9NIHJlbmRlcmVyIGVudGlyZWx5XG5cbmZ1bmN0aW9uIG9wdGlvbnMocGF0aCwgcmFuZ2VzKSB7XG4gIHJldHVybiB7XG4gICAgb25SZW5kZXI6IGZ1bmN0aW9uIG9uUmVuZGVyKG5vZGUsIGRvbSwgb2Zmc2V0KSB7XG4gICAgICBpZiAoIW5vZGUuaXNUZXh0ICYmIG5vZGUudHlwZS5jb250YWlucyA9PSBudWxsKSB7XG4gICAgICAgIGRvbS5jb250ZW50RWRpdGFibGUgPSBmYWxzZTtcbiAgICAgICAgaWYgKG5vZGUuaXNCbG9jaykgZG9tLnNldEF0dHJpYnV0ZShcInBtLWxlYWZcIiwgXCJ0cnVlXCIpO1xuICAgICAgfVxuICAgICAgaWYgKG5vZGUuaXNCbG9jayAmJiBvZmZzZXQgIT0gbnVsbCkgZG9tLnNldEF0dHJpYnV0ZShcInBtLW9mZnNldFwiLCBvZmZzZXQpO1xuICAgICAgaWYgKG5vZGUuaXNUZXh0YmxvY2spIGFkanVzdFRyYWlsaW5nSGFja3MoZG9tLCBub2RlKTtcblxuICAgICAgcmV0dXJuIGRvbTtcbiAgICB9LFxuICAgIHJlbmRlcklubGluZUZsYXQ6IGZ1bmN0aW9uIHJlbmRlcklubGluZUZsYXQobm9kZSwgZG9tLCBvZmZzZXQpIHtcbiAgICAgIHJhbmdlcy5hZHZhbmNlVG8obmV3IF9tb2RlbC5Qb3MocGF0aCwgb2Zmc2V0KSk7XG4gICAgICB2YXIgZW5kID0gbmV3IF9tb2RlbC5Qb3MocGF0aCwgb2Zmc2V0ICsgbm9kZS53aWR0aCk7XG4gICAgICB2YXIgbmV4dEN1dCA9IHJhbmdlcy5uZXh0Q2hhbmdlQmVmb3JlKGVuZCk7XG5cbiAgICAgIHZhciBpbm5lciA9IGRvbSxcbiAgICAgICAgICB3cmFwcGVkID0gdW5kZWZpbmVkO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLm1hcmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlubmVyID0gaW5uZXIuZmlyc3RDaGlsZDtcbiAgICAgIH1pZiAoZG9tLm5vZGVUeXBlICE9IDEpIHtcbiAgICAgICAgZG9tID0gKDAsIF9kb20uZWx0KShcInNwYW5cIiwgbnVsbCwgZG9tKTtcbiAgICAgICAgaWYgKCFuZXh0Q3V0KSB3cmFwcGVkID0gZG9tO1xuICAgICAgfVxuICAgICAgaWYgKCF3cmFwcGVkICYmIChuZXh0Q3V0IHx8IHJhbmdlcy5jdXJyZW50Lmxlbmd0aCkpIHtcbiAgICAgICAgd3JhcHBlZCA9IGlubmVyID09IGRvbSA/IGRvbSA9ICgwLCBfZG9tLmVsdCkoXCJzcGFuXCIsIG51bGwsIGlubmVyKSA6IGlubmVyLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQoKDAsIF9kb20uZWx0KShcInNwYW5cIiwgbnVsbCwgaW5uZXIpKTtcbiAgICAgIH1cblxuICAgICAgZG9tLnNldEF0dHJpYnV0ZShcInBtLW9mZnNldFwiLCBvZmZzZXQpO1xuICAgICAgaWYgKG5vZGUudHlwZS5jb250YWlucyA9PSBudWxsKSBkb20uc2V0QXR0cmlidXRlKFwicG0tbGVhZlwiLCBub2RlLmlzVGV4dCA/IG5vZGUud2lkdGggOiBcInRydWVcIik7XG5cbiAgICAgIHZhciBpbmxpbmVPZmZzZXQgPSAwO1xuICAgICAgd2hpbGUgKG5leHRDdXQpIHtcbiAgICAgICAgdmFyIHNpemUgPSBuZXh0Q3V0IC0gb2Zmc2V0O1xuICAgICAgICB2YXIgc3BsaXQgPSBzcGxpdFNwYW4od3JhcHBlZCwgc2l6ZSk7XG4gICAgICAgIGlmIChyYW5nZXMuY3VycmVudC5sZW5ndGgpIHNwbGl0LmNsYXNzTmFtZSA9IHJhbmdlcy5jdXJyZW50LmpvaW4oXCIgXCIpO1xuICAgICAgICBzcGxpdC5zZXRBdHRyaWJ1dGUoXCJwbS1pbm5lci1vZmZzZXRcIiwgaW5saW5lT2Zmc2V0KTtcbiAgICAgICAgaW5saW5lT2Zmc2V0ICs9IHNpemU7XG4gICAgICAgIG9mZnNldCArPSBzaXplO1xuICAgICAgICByYW5nZXMuYWR2YW5jZVRvKG5ldyBfbW9kZWwuUG9zKHBhdGgsIG9mZnNldCkpO1xuICAgICAgICBpZiAoIShuZXh0Q3V0ID0gcmFuZ2VzLm5leHRDaGFuZ2VCZWZvcmUoZW5kKSkpIHdyYXBwZWQuc2V0QXR0cmlidXRlKFwicG0taW5uZXItb2Zmc2V0XCIsIGlubGluZU9mZnNldCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyYW5nZXMuY3VycmVudC5sZW5ndGgpIHdyYXBwZWQuY2xhc3NOYW1lID0gcmFuZ2VzLmN1cnJlbnQuam9pbihcIiBcIik7XG4gICAgICByZXR1cm4gZG9tO1xuICAgIH0sXG4gICAgZG9jdW1lbnQ6IGRvY3VtZW50LCBwYXRoOiBwYXRoXG4gIH07XG59XG5cbmZ1bmN0aW9uIHNwbGl0U3BhbihzcGFuLCBhdCkge1xuICB2YXIgdGV4dE5vZGUgPSBzcGFuLmZpcnN0Q2hpbGQsXG4gICAgICB0ZXh0ID0gdGV4dE5vZGUubm9kZVZhbHVlO1xuICB2YXIgbmV3Tm9kZSA9IHNwYW4ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoKDAsIF9kb20uZWx0KShcInNwYW5cIiwgbnVsbCwgdGV4dC5zbGljZSgwLCBhdCkpLCBzcGFuKTtcbiAgdGV4dE5vZGUubm9kZVZhbHVlID0gdGV4dC5zbGljZShhdCk7XG4gIHJldHVybiBuZXdOb2RlO1xufVxuXG5mdW5jdGlvbiBkcmF3KHBtLCBkb2MpIHtcbiAgcG0uY29udGVudC50ZXh0Q29udGVudCA9IFwiXCI7XG4gIHBtLmNvbnRlbnQuYXBwZW5kQ2hpbGQoKDAsIF9zZXJpYWxpemVEb20udG9ET00pKGRvYywgb3B0aW9ucyhbXSwgcG0ucmFuZ2VzLmFjdGl2ZVJhbmdlVHJhY2tlcigpKSkpO1xufVxuXG5mdW5jdGlvbiBhZGp1c3RUcmFpbGluZ0hhY2tzKGRvbSwgbm9kZSkge1xuICB2YXIgbmVlZHMgPSBub2RlLnNpemUgPT0gMCB8fCBub2RlLmxhc3RDaGlsZC50eXBlLmlzQlIgPyBcImJyXCIgOiAhbm9kZS5sYXN0Q2hpbGQuaXNUZXh0ICYmIG5vZGUubGFzdENoaWxkLnR5cGUuY29udGFpbnMgPT0gbnVsbCA/IFwidGV4dFwiIDogbnVsbDtcbiAgdmFyIGxhc3QgPSBkb20ubGFzdENoaWxkO1xuICB2YXIgaGFzID0gIWxhc3QgfHwgbGFzdC5ub2RlVHlwZSAhPSAxIHx8ICFsYXN0Lmhhc0F0dHJpYnV0ZShcInBtLWlnbm9yZVwiKSA/IG51bGwgOiBsYXN0Lm5vZGVOYW1lID09IFwiQlJcIiA/IFwiYnJcIiA6IFwidGV4dFwiO1xuICBpZiAobmVlZHMgIT0gaGFzKSB7XG4gICAgaWYgKGhhcykgZG9tLnJlbW92ZUNoaWxkKGxhc3QpO1xuICAgIGlmIChuZWVkcykgZG9tLmFwcGVuZENoaWxkKG5lZWRzID09IFwiYnJcIiA/ICgwLCBfZG9tLmVsdCkoXCJiclwiLCB7IFwicG0taWdub3JlXCI6IFwidHJhaWxpbmctYnJlYWtcIiB9KSA6ICgwLCBfZG9tLmVsdCkoXCJzcGFuXCIsIHsgXCJwbS1pZ25vcmVcIjogXCJjdXJzb3ItdGV4dFwiIH0sIFwiXCIpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kTm9kZUluKGl0ZXIsIG5vZGUpIHtcbiAgdmFyIGNvcHkgPSBpdGVyLmNvcHkoKTtcbiAgZm9yICh2YXIgY2hpbGQgPSB1bmRlZmluZWQ7IGNoaWxkID0gY29weS5uZXh0KCkudmFsdWU7KSB7XG4gICAgaWYgKGNoaWxkID09IG5vZGUpIHJldHVybiBjaGlsZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3ZlUGFzdChkb20pIHtcbiAgdmFyIG5leHQgPSBkb20ubmV4dFNpYmxpbmc7XG4gIGRvbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGRvbSk7XG4gIHJldHVybiBuZXh0O1xufVxuXG5mdW5jdGlvbiByZWRyYXcocG0sIGRpcnR5LCBkb2MsIHByZXYpIHtcbiAgdmFyIG9wdHMgPSBvcHRpb25zKFtdLCBwbS5yYW5nZXMuYWN0aXZlUmFuZ2VUcmFja2VyKCkpO1xuXG4gIGZ1bmN0aW9uIHNjYW4oZG9tLCBub2RlLCBwcmV2KSB7XG4gICAgdmFyIGlOb2RlID0gbm9kZS5pdGVyKCksXG4gICAgICAgIGlQcmV2ID0gcHJldi5pdGVyKCksXG4gICAgICAgIHBDaGlsZCA9IGlQcmV2Lm5leHQoKS52YWx1ZTtcbiAgICB2YXIgZG9tUG9zID0gZG9tLmZpcnN0Q2hpbGQ7XG5cbiAgICBmb3IgKHZhciBjaGlsZCA9IHVuZGVmaW5lZDsgY2hpbGQgPSBpTm9kZS5uZXh0KCkudmFsdWU7KSB7XG4gICAgICB2YXIgb2Zmc2V0ID0gaU5vZGUub2Zmc2V0IC0gY2hpbGQud2lkdGgsXG4gICAgICAgICAgbWF0Y2hpbmcgPSB1bmRlZmluZWQsXG4gICAgICAgICAgcmV1c2VET00gPSB1bmRlZmluZWQ7XG4gICAgICBpZiAoIW5vZGUuaXNUZXh0YmxvY2spIG9wdHMucGF0aC5wdXNoKG9mZnNldCk7XG5cbiAgICAgIGlmIChwQ2hpbGQgPT0gY2hpbGQpIHtcbiAgICAgICAgbWF0Y2hpbmcgPSBwQ2hpbGQ7XG4gICAgICB9IGVsc2UgaWYgKG1hdGNoaW5nID0gZmluZE5vZGVJbihpUHJldiwgY2hpbGQpKSB7XG4gICAgICAgIHdoaWxlIChwQ2hpbGQgIT0gbWF0Y2hpbmcpIHtcbiAgICAgICAgICBwQ2hpbGQgPSBpUHJldi5uZXh0KCkudmFsdWU7XG4gICAgICAgICAgZG9tUG9zID0gbW92ZVBhc3QoZG9tUG9zKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobWF0Y2hpbmcgJiYgIWRpcnR5LmdldChtYXRjaGluZykpIHtcbiAgICAgICAgcmV1c2VET00gPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChwQ2hpbGQgJiYgIWNoaWxkLmlzVGV4dCAmJiBjaGlsZC5zYW1lTWFya3VwKHBDaGlsZCkgJiYgZGlydHkuZ2V0KHBDaGlsZCkgIT0gX21haW4uRElSVFlfUkVEUkFXKSB7XG4gICAgICAgIHJldXNlRE9NID0gdHJ1ZTtcbiAgICAgICAgdmFyIGNvbnRlbnROb2RlID0gZG9tUG9zO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgdmFyIGZpcnN0ID0gY29udGVudE5vZGUuZmlyc3RDaGlsZDtcbiAgICAgICAgICBpZiAoIWZpcnN0IHx8ICFmaXJzdC5oYXNBdHRyaWJ1dGUgfHwgZmlyc3QuaGFzQXR0cmlidXRlKFwicG0taWdub3JlXCIpIHx8IGZpcnN0Lmhhc0F0dHJpYnV0ZShcInBtLW9mZnNldFwiKSkgYnJlYWs7XG4gICAgICAgICAgY29udGVudE5vZGUgPSBmaXJzdDtcbiAgICAgICAgfVxuICAgICAgICBzY2FuKGNvbnRlbnROb2RlLCBjaGlsZCwgcENoaWxkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciByZW5kZXJlZCA9ICgwLCBfc2VyaWFsaXplRG9tLnJlbmRlck5vZGVUb0RPTSkoY2hpbGQsIG9wdHMsIG9mZnNldCk7XG4gICAgICAgIGRvbS5pbnNlcnRCZWZvcmUocmVuZGVyZWQsIGRvbVBvcyk7XG4gICAgICAgIHJldXNlRE9NID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXVzZURPTSkge1xuICAgICAgICBkb21Qb3Muc2V0QXR0cmlidXRlKFwicG0tb2Zmc2V0XCIsIG9mZnNldCk7XG4gICAgICAgIGRvbVBvcyA9IGRvbVBvcy5uZXh0U2libGluZztcbiAgICAgICAgcENoaWxkID0gaVByZXYubmV4dCgpLnZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKCFub2RlLmlzVGV4dGJsb2NrKSBvcHRzLnBhdGgucG9wKCk7XG4gICAgfVxuXG4gICAgd2hpbGUgKHBDaGlsZCkge1xuICAgICAgZG9tUG9zID0gbW92ZVBhc3QoZG9tUG9zKTtcbiAgICAgIHBDaGlsZCA9IGlQcmV2Lm5leHQoKS52YWx1ZTtcbiAgICB9XG4gICAgaWYgKG5vZGUuaXNUZXh0YmxvY2spIGFkanVzdFRyYWlsaW5nSGFja3MoZG9tLCBub2RlKTtcbiAgfVxuICBzY2FuKHBtLmNvbnRlbnQsIGRvYywgcHJldik7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIF9tb2RlbCA9IHJlcXVpcmUoXCIuLi9tb2RlbFwiKTtcblxudmFyIF90cmFuc2Zvcm0gPSByZXF1aXJlKFwiLi4vdHJhbnNmb3JtXCIpO1xuXG52YXIgSW52ZXJ0ZWRTdGVwID0gZnVuY3Rpb24gSW52ZXJ0ZWRTdGVwKHN0ZXAsIHZlcnNpb24sIGlkKSB7XG4gIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBJbnZlcnRlZFN0ZXApO1xuXG4gIHRoaXMuc3RlcCA9IHN0ZXA7XG4gIHRoaXMudmVyc2lvbiA9IHZlcnNpb247XG4gIHRoaXMuaWQgPSBpZDtcbn07XG5cbnZhciBCcmFuY2hSZW1hcHBpbmcgPSAoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBCcmFuY2hSZW1hcHBpbmcoYnJhbmNoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEJyYW5jaFJlbWFwcGluZyk7XG5cbiAgICB0aGlzLmJyYW5jaCA9IGJyYW5jaDtcbiAgICB0aGlzLnJlbWFwID0gbmV3IF90cmFuc2Zvcm0uUmVtYXBwaW5nKCk7XG4gICAgdGhpcy52ZXJzaW9uID0gYnJhbmNoLnZlcnNpb247XG4gICAgdGhpcy5taXJyb3JCdWZmZXIgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEJyYW5jaFJlbWFwcGluZywgW3tcbiAgICBrZXk6IFwibW92ZVRvVmVyc2lvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtb3ZlVG9WZXJzaW9uKHZlcnNpb24pIHtcbiAgICAgIHdoaWxlICh0aGlzLnZlcnNpb24gPiB2ZXJzaW9uKSB0aGlzLmFkZE5leHRNYXAoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkTmV4dE1hcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGROZXh0TWFwKCkge1xuICAgICAgdmFyIGZvdW5kID0gdGhpcy5icmFuY2gubWlycm9yW3RoaXMudmVyc2lvbl07XG4gICAgICB2YXIgbWFwT2Zmc2V0ID0gdGhpcy5icmFuY2gubWFwcy5sZW5ndGggLSAodGhpcy5icmFuY2gudmVyc2lvbiAtIHRoaXMudmVyc2lvbikgLSAxO1xuICAgICAgdmFyIGlkID0gdGhpcy5yZW1hcC5hZGRUb0Zyb250KHRoaXMuYnJhbmNoLm1hcHNbbWFwT2Zmc2V0XSwgdGhpcy5taXJyb3JCdWZmZXJbdGhpcy52ZXJzaW9uXSk7XG4gICAgICAtLXRoaXMudmVyc2lvbjtcbiAgICAgIGlmIChmb3VuZCAhPSBudWxsKSB0aGlzLm1pcnJvckJ1ZmZlcltmb3VuZF0gPSBpZDtcbiAgICAgIHJldHVybiBpZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibW92ZVBhc3RTdGVwXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1vdmVQYXN0U3RlcChyZXN1bHQpIHtcbiAgICAgIHZhciBpZCA9IHRoaXMuYWRkTmV4dE1hcCgpO1xuICAgICAgaWYgKHJlc3VsdCkgdGhpcy5yZW1hcC5hZGRUb0JhY2socmVzdWx0Lm1hcCwgaWQpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBCcmFuY2hSZW1hcHBpbmc7XG59KSgpO1xuXG52YXIgd29ya1RpbWUgPSAxMDAsXG4gICAgcGF1c2VUaW1lID0gMTUwO1xuXG52YXIgQ29tcHJlc3Npb25Xb3JrZXIgPSAoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBDb21wcmVzc2lvbldvcmtlcihkb2MsIGJyYW5jaCwgY2FsbGJhY2spIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ29tcHJlc3Npb25Xb3JrZXIpO1xuXG4gICAgdGhpcy5icmFuY2ggPSBicmFuY2g7XG4gICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIHRoaXMucmVtYXAgPSBuZXcgQnJhbmNoUmVtYXBwaW5nKGJyYW5jaCk7XG5cbiAgICB0aGlzLmRvYyA9IGRvYztcbiAgICB0aGlzLmV2ZW50cyA9IFtdO1xuICAgIHRoaXMubWFwcyA9IFtdO1xuICAgIHRoaXMudmVyc2lvbiA9IHRoaXMuc3RhcnRWZXJzaW9uID0gYnJhbmNoLnZlcnNpb247XG5cbiAgICB0aGlzLmkgPSBicmFuY2guZXZlbnRzLmxlbmd0aDtcbiAgICB0aGlzLnRpbWVvdXQgPSBudWxsO1xuICAgIHRoaXMuYWJvcnRlZCA9IGZhbHNlO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKENvbXByZXNzaW9uV29ya2VyLCBbe1xuICAgIGtleTogXCJ3b3JrXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHdvcmsoKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5hYm9ydGVkKSByZXR1cm47XG5cbiAgICAgIHZhciBlbmRUaW1lID0gRGF0ZS5ub3coKSArIHdvcmtUaW1lO1xuXG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIGlmICh0aGlzLmkgPT0gMCkgcmV0dXJuIHRoaXMuZmluaXNoKCk7XG4gICAgICAgIHZhciBfZXZlbnQgPSB0aGlzLmJyYW5jaC5ldmVudHNbLS10aGlzLmldLFxuICAgICAgICAgICAgb3V0RXZlbnQgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaiA9IF9ldmVudC5sZW5ndGggLSAxOyBqID49IDA7IGotLSkge1xuICAgICAgICAgIHZhciBfZXZlbnQkaiA9IF9ldmVudFtqXTtcbiAgICAgICAgICB2YXIgc3RlcCA9IF9ldmVudCRqLnN0ZXA7XG4gICAgICAgICAgdmFyIHN0ZXBWZXJzaW9uID0gX2V2ZW50JGoudmVyc2lvbjtcbiAgICAgICAgICB2YXIgc3RlcElEID0gX2V2ZW50JGouaWQ7XG5cbiAgICAgICAgICB0aGlzLnJlbWFwLm1vdmVUb1ZlcnNpb24oc3RlcFZlcnNpb24pO1xuXG4gICAgICAgICAgdmFyIG1hcHBlZFN0ZXAgPSBzdGVwLm1hcCh0aGlzLnJlbWFwLnJlbWFwKTtcbiAgICAgICAgICBpZiAobWFwcGVkU3RlcCAmJiBpc0RlbFN0ZXAoc3RlcCkpIHtcbiAgICAgICAgICAgIHZhciBleHRyYSA9IDAsXG4gICAgICAgICAgICAgICAgc3RhcnQgPSBzdGVwLmZyb207XG4gICAgICAgICAgICB3aGlsZSAoaiA+IDApIHtcbiAgICAgICAgICAgICAgdmFyIG5leHQgPSBfZXZlbnRbaiAtIDFdO1xuICAgICAgICAgICAgICBpZiAobmV4dC52ZXJzaW9uICE9IHN0ZXBWZXJzaW9uIC0gMSB8fCAhaXNEZWxTdGVwKG5leHQuc3RlcCkgfHwgc3RhcnQuY21wKG5leHQuc3RlcC50bykpIGJyZWFrO1xuICAgICAgICAgICAgICBleHRyYSArPSBuZXh0LnN0ZXAudG8ub2Zmc2V0IC0gbmV4dC5zdGVwLmZyb20ub2Zmc2V0O1xuICAgICAgICAgICAgICBzdGFydCA9IG5leHQuc3RlcC5mcm9tO1xuICAgICAgICAgICAgICBzdGVwVmVyc2lvbi0tO1xuICAgICAgICAgICAgICBqLS07XG4gICAgICAgICAgICAgIHRoaXMucmVtYXAuYWRkTmV4dE1hcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV4dHJhID4gMCkge1xuICAgICAgICAgICAgICB2YXIgX3N0YXJ0ID0gbWFwcGVkU3RlcC5mcm9tLm1vdmUoLWV4dHJhKTtcbiAgICAgICAgICAgICAgbWFwcGVkU3RlcCA9IG5ldyBfdHJhbnNmb3JtLlN0ZXAoXCJyZXBsYWNlXCIsIF9zdGFydCwgbWFwcGVkU3RlcC50bywgX3N0YXJ0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IG1hcHBlZFN0ZXAgJiYgbWFwcGVkU3RlcC5hcHBseSh0aGlzLmRvYyk7XG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgdGhpcy5kb2MgPSByZXN1bHQuZG9jO1xuICAgICAgICAgICAgdGhpcy5tYXBzLnB1c2gocmVzdWx0Lm1hcC5pbnZlcnQoKSk7XG4gICAgICAgICAgICBvdXRFdmVudC5wdXNoKG5ldyBJbnZlcnRlZFN0ZXAobWFwcGVkU3RlcCwgdGhpcy52ZXJzaW9uLCBzdGVwSUQpKTtcbiAgICAgICAgICAgIHRoaXMudmVyc2lvbi0tO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnJlbWFwLm1vdmVQYXN0U3RlcChyZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvdXRFdmVudC5sZW5ndGgpIHtcbiAgICAgICAgICBvdXRFdmVudC5yZXZlcnNlKCk7XG4gICAgICAgICAgdGhpcy5ldmVudHMucHVzaChvdXRFdmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKERhdGUubm93KCkgPiBlbmRUaW1lKSB7XG4gICAgICAgICAgdGhpcy50aW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLndvcmsoKTtcbiAgICAgICAgICB9LCBwYXVzZVRpbWUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJmaW5pc2hcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZmluaXNoKCkge1xuICAgICAgaWYgKHRoaXMuYWJvcnRlZCkgcmV0dXJuO1xuXG4gICAgICB0aGlzLmV2ZW50cy5yZXZlcnNlKCk7XG4gICAgICB0aGlzLm1hcHMucmV2ZXJzZSgpO1xuICAgICAgdGhpcy5jYWxsYmFjayh0aGlzLm1hcHMuY29uY2F0KHRoaXMuYnJhbmNoLm1hcHMuc2xpY2UodGhpcy5icmFuY2gubWFwcy5sZW5ndGggLSAodGhpcy5icmFuY2gudmVyc2lvbiAtIHRoaXMuc3RhcnRWZXJzaW9uKSkpLCB0aGlzLmV2ZW50cyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImFib3J0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFib3J0KCkge1xuICAgICAgdGhpcy5hYm9ydGVkID0gdHJ1ZTtcbiAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQ29tcHJlc3Npb25Xb3JrZXI7XG59KSgpO1xuXG5mdW5jdGlvbiBpc0RlbFN0ZXAoc3RlcCkge1xuICByZXR1cm4gc3RlcC50eXBlID09IFwicmVwbGFjZVwiICYmIHN0ZXAuZnJvbS5vZmZzZXQgPCBzdGVwLnRvLm9mZnNldCAmJiBfbW9kZWwuUG9zLnNhbWVQYXRoKHN0ZXAuZnJvbS5wYXRoLCBzdGVwLnRvLnBhdGgpICYmICghc3RlcC5wYXJhbSB8fCBzdGVwLnBhcmFtLmNvbnRlbnQuc2l6ZSA9PSAwKTtcbn1cblxudmFyIGNvbXByZXNzU3RlcENvdW50ID0gMTUwO1xuXG52YXIgQnJhbmNoID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQnJhbmNoKG1heERlcHRoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEJyYW5jaCk7XG5cbiAgICB0aGlzLm1heERlcHRoID0gbWF4RGVwdGg7XG4gICAgdGhpcy52ZXJzaW9uID0gMDtcbiAgICB0aGlzLm5leHRTdGVwSUQgPSAxO1xuXG4gICAgdGhpcy5tYXBzID0gW107XG4gICAgdGhpcy5taXJyb3IgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMuZXZlbnRzID0gW107XG5cbiAgICB0aGlzLnN0ZXBzU2luY2VDb21wcmVzcyA9IDA7XG4gICAgdGhpcy5jb21wcmVzc2luZyA9IG51bGw7XG4gICAgdGhpcy5jb21wcmVzc1RpbWVvdXQgPSBudWxsO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEJyYW5jaCwgW3tcbiAgICBrZXk6IFwiY2xlYXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2xlYXIoZm9yY2UpIHtcbiAgICAgIGlmIChmb3JjZSB8fCAhdGhpcy5lbXB0eSgpKSB7XG4gICAgICAgIHRoaXMubWFwcy5sZW5ndGggPSB0aGlzLmV2ZW50cy5sZW5ndGggPSB0aGlzLnN0ZXBzU2luY2VDb21wcmVzcyA9IDA7XG4gICAgICAgIHRoaXMubWlycm9yID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy5hYm9ydENvbXByZXNzaW9uKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm5ld0V2ZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5ld0V2ZW50KCkge1xuICAgICAgdGhpcy5hYm9ydENvbXByZXNzaW9uKCk7XG4gICAgICB0aGlzLmV2ZW50cy5wdXNoKFtdKTtcbiAgICAgIHdoaWxlICh0aGlzLmV2ZW50cy5sZW5ndGggPiB0aGlzLm1heERlcHRoKSB0aGlzLmV2ZW50cy5zaGlmdCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhZGRNYXBcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkTWFwKG1hcCkge1xuICAgICAgaWYgKCF0aGlzLmVtcHR5KCkpIHtcbiAgICAgICAgdGhpcy5tYXBzLnB1c2gobWFwKTtcbiAgICAgICAgdGhpcy52ZXJzaW9uKys7XG4gICAgICAgIHRoaXMuc3RlcHNTaW5jZUNvbXByZXNzKys7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJlbXB0eVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlbXB0eSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmV2ZW50cy5sZW5ndGggPT0gMDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkU3RlcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRTdGVwKHN0ZXAsIG1hcCwgaWQpIHtcbiAgICAgIHRoaXMuYWRkTWFwKG1hcCk7XG4gICAgICBpZiAoaWQgPT0gbnVsbCkgaWQgPSB0aGlzLm5leHRTdGVwSUQrKztcbiAgICAgIHRoaXMuZXZlbnRzW3RoaXMuZXZlbnRzLmxlbmd0aCAtIDFdLnB1c2gobmV3IEludmVydGVkU3RlcChzdGVwLCB0aGlzLnZlcnNpb24sIGlkKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImFkZFRyYW5zZm9ybVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRUcmFuc2Zvcm0odHJhbnNmb3JtLCBpZHMpIHtcbiAgICAgIHRoaXMuYWJvcnRDb21wcmVzc2lvbigpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmFuc2Zvcm0uc3RlcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGludmVydGVkID0gdHJhbnNmb3JtLnN0ZXBzW2ldLmludmVydCh0cmFuc2Zvcm0uZG9jc1tpXSwgdHJhbnNmb3JtLm1hcHNbaV0pO1xuICAgICAgICB0aGlzLmFkZFN0ZXAoaW52ZXJ0ZWQsIHRyYW5zZm9ybS5tYXBzW2ldLCBpZHMgJiYgaWRzW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicG9wRXZlbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcG9wRXZlbnQoZG9jLCBhbGxvd0NvbGxhcHNpbmcpIHtcbiAgICAgIHRoaXMuYWJvcnRDb21wcmVzc2lvbigpO1xuICAgICAgdmFyIGV2ZW50ID0gdGhpcy5ldmVudHMucG9wKCk7XG4gICAgICBpZiAoIWV2ZW50KSByZXR1cm4gbnVsbDtcblxuICAgICAgdmFyIHJlbWFwID0gbmV3IEJyYW5jaFJlbWFwcGluZyh0aGlzKSxcbiAgICAgICAgICBjb2xsYXBzaW5nID0gYWxsb3dDb2xsYXBzaW5nO1xuICAgICAgdmFyIHRyID0gbmV3IF90cmFuc2Zvcm0uVHJhbnNmb3JtKGRvYyk7XG4gICAgICB2YXIgaWRzID0gW107XG5cbiAgICAgIGZvciAodmFyIGkgPSBldmVudC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB2YXIgaW52ZXJ0ZWRTdGVwID0gZXZlbnRbaV0sXG4gICAgICAgICAgICBzdGVwID0gaW52ZXJ0ZWRTdGVwLnN0ZXA7XG4gICAgICAgIGlmICghY29sbGFwc2luZyB8fCBpbnZlcnRlZFN0ZXAudmVyc2lvbiAhPSByZW1hcC52ZXJzaW9uKSB7XG4gICAgICAgICAgY29sbGFwc2luZyA9IGZhbHNlO1xuICAgICAgICAgIHJlbWFwLm1vdmVUb1ZlcnNpb24oaW52ZXJ0ZWRTdGVwLnZlcnNpb24pO1xuXG4gICAgICAgICAgc3RlcCA9IHN0ZXAubWFwKHJlbWFwLnJlbWFwKTtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gc3RlcCAmJiB0ci5zdGVwKHN0ZXApO1xuICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIGlkcy5wdXNoKGludmVydGVkU3RlcC5pZCk7XG4gICAgICAgICAgICBpZiAodGhpcy5hZGRNYXAocmVzdWx0Lm1hcCkpIHRoaXMubWlycm9yW3RoaXMudmVyc2lvbl0gPSBpbnZlcnRlZFN0ZXAudmVyc2lvbjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaSA+IDApIHJlbWFwLm1vdmVQYXN0U3RlcChyZXN1bHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudmVyc2lvbi0tO1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLm1pcnJvclt0aGlzLnZlcnNpb25dO1xuICAgICAgICAgIHRoaXMubWFwcy5wb3AoKTtcbiAgICAgICAgICB0ci5zdGVwKHN0ZXApO1xuICAgICAgICAgIGlkcy5wdXNoKGludmVydGVkU3RlcC5pZCk7XG4gICAgICAgICAgLS1yZW1hcC52ZXJzaW9uO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5lbXB0eSgpKSB0aGlzLmNsZWFyKHRydWUpO1xuICAgICAgcmV0dXJuIHsgdHJhbnNmb3JtOiB0ciwgaWRzOiBpZHMgfTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0VmVyc2lvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRWZXJzaW9uKCkge1xuICAgICAgcmV0dXJuIHsgaWQ6IHRoaXMubmV4dFN0ZXBJRCwgdmVyc2lvbjogdGhpcy52ZXJzaW9uIH07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImZpbmRWZXJzaW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZpbmRWZXJzaW9uKHZlcnNpb24pIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLmV2ZW50cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB2YXIgX2V2ZW50MiA9IHRoaXMuZXZlbnRzW2ldO1xuICAgICAgICBmb3IgKHZhciBqID0gX2V2ZW50Mi5sZW5ndGggLSAxOyBqID49IDA7IGotLSkge1xuICAgICAgICAgIHZhciBzdGVwID0gX2V2ZW50MltqXTtcbiAgICAgICAgICBpZiAoc3RlcC5pZCA9PSB2ZXJzaW9uLmlkKSByZXR1cm4geyBldmVudDogaSwgc3RlcDogaiB9O2Vsc2UgaWYgKHN0ZXAuaWQgPCB2ZXJzaW9uLmlkKSByZXR1cm4geyBldmVudDogaSwgc3RlcDogaiArIDEgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZWJhc2VkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlYmFzZWQobmV3TWFwcywgcmViYXNlZFRyYW5zZm9ybSwgcG9zaXRpb25zKSB7XG4gICAgICBpZiAodGhpcy5lbXB0eSgpKSByZXR1cm47XG4gICAgICB0aGlzLmFib3J0Q29tcHJlc3Npb24oKTtcblxuICAgICAgdmFyIHN0YXJ0VmVyc2lvbiA9IHRoaXMudmVyc2lvbiAtIHBvc2l0aW9ucy5sZW5ndGg7XG5cbiAgICAgIC8vIFVwZGF0ZSBhbmQgY2xlYW4gdXAgdGhlIGV2ZW50c1xuICAgICAgb3V0OiBmb3IgKHZhciBpID0gdGhpcy5ldmVudHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdmFyIF9ldmVudDMgPSB0aGlzLmV2ZW50c1tpXTtcbiAgICAgICAgZm9yICh2YXIgaiA9IF9ldmVudDMubGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0pIHtcbiAgICAgICAgICB2YXIgc3RlcCA9IF9ldmVudDNbal07XG4gICAgICAgICAgaWYgKHN0ZXAudmVyc2lvbiA8PSBzdGFydFZlcnNpb24pIGJyZWFrIG91dDtcbiAgICAgICAgICB2YXIgb2ZmID0gcG9zaXRpb25zW3N0ZXAudmVyc2lvbiAtIHN0YXJ0VmVyc2lvbiAtIDFdO1xuICAgICAgICAgIGlmIChvZmYgPT0gLTEpIHtcbiAgICAgICAgICAgIF9ldmVudDMuc3BsaWNlKGotLSwgMSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBpbnYgPSByZWJhc2VkVHJhbnNmb3JtLnN0ZXBzW29mZl0uaW52ZXJ0KHJlYmFzZWRUcmFuc2Zvcm0uZG9jc1tvZmZdLCByZWJhc2VkVHJhbnNmb3JtLm1hcHNbb2ZmXSk7XG4gICAgICAgICAgICBfZXZlbnQzW2pdID0gbmV3IEludmVydGVkU3RlcChpbnYsIHN0YXJ0VmVyc2lvbiArIG5ld01hcHMubGVuZ3RoICsgb2ZmICsgMSwgc3RlcC5pZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFN5bmMgdGhlIGFycmF5IG9mIG1hcHNcbiAgICAgIGlmICh0aGlzLm1hcHMubGVuZ3RoID4gcG9zaXRpb25zLmxlbmd0aCkgdGhpcy5tYXBzID0gdGhpcy5tYXBzLnNsaWNlKDAsIHRoaXMubWFwcy5sZW5ndGggLSBwb3NpdGlvbnMubGVuZ3RoKS5jb25jYXQobmV3TWFwcykuY29uY2F0KHJlYmFzZWRUcmFuc2Zvcm0ubWFwcyk7ZWxzZSB0aGlzLm1hcHMgPSByZWJhc2VkVHJhbnNmb3JtLm1hcHMuc2xpY2UoKTtcblxuICAgICAgdGhpcy52ZXJzaW9uID0gc3RhcnRWZXJzaW9uICsgbmV3TWFwcy5sZW5ndGggKyByZWJhc2VkVHJhbnNmb3JtLm1hcHMubGVuZ3RoO1xuXG4gICAgICB0aGlzLnN0ZXBzU2luY2VDb21wcmVzcyArPSBuZXdNYXBzLmxlbmd0aCArIHJlYmFzZWRUcmFuc2Zvcm0uc3RlcHMubGVuZ3RoIC0gcG9zaXRpb25zLmxlbmd0aDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWJvcnRDb21wcmVzc2lvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhYm9ydENvbXByZXNzaW9uKCkge1xuICAgICAgaWYgKHRoaXMuY29tcHJlc3NpbmcpIHtcbiAgICAgICAgdGhpcy5jb21wcmVzc2luZy5hYm9ydCgpO1xuICAgICAgICB0aGlzLmNvbXByZXNzaW5nID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibmVlZHNDb21wcmVzc2lvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBuZWVkc0NvbXByZXNzaW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RlcHNTaW5jZUNvbXByZXNzID4gY29tcHJlc3NTdGVwQ291bnQgJiYgIXRoaXMuY29tcHJlc3Npbmc7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInN0YXJ0Q29tcHJlc3Npb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3RhcnRDb21wcmVzc2lvbihkb2MpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB0aGlzLmNvbXByZXNzaW5nID0gbmV3IENvbXByZXNzaW9uV29ya2VyKGRvYywgdGhpcywgZnVuY3Rpb24gKG1hcHMsIGV2ZW50cykge1xuICAgICAgICBfdGhpczIubWFwcyA9IG1hcHM7XG4gICAgICAgIF90aGlzMi5ldmVudHMgPSBldmVudHM7XG4gICAgICAgIF90aGlzMi5taXJyb3IgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBfdGhpczIuY29tcHJlc3NpbmcgPSBudWxsO1xuICAgICAgICBfdGhpczIuc3RlcHNTaW5jZUNvbXByZXNzID0gMDtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5jb21wcmVzc2luZy53b3JrKCk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEJyYW5jaDtcbn0pKCk7XG5cbnZhciBjb21wcmVzc0RlbGF5ID0gNzUwO1xuXG52YXIgSGlzdG9yeSA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEhpc3RvcnkocG0pIHtcbiAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBIaXN0b3J5KTtcblxuICAgIHRoaXMucG0gPSBwbTtcblxuICAgIHRoaXMuZG9uZSA9IG5ldyBCcmFuY2gocG0ub3B0aW9ucy5oaXN0b3J5RGVwdGgpO1xuICAgIHRoaXMudW5kb25lID0gbmV3IEJyYW5jaChwbS5vcHRpb25zLmhpc3RvcnlEZXB0aCk7XG5cbiAgICB0aGlzLmxhc3RBZGRlZEF0ID0gMDtcbiAgICB0aGlzLmlnbm9yZVRyYW5zZm9ybSA9IGZhbHNlO1xuXG4gICAgdGhpcy5hbGxvd0NvbGxhcHNpbmcgPSB0cnVlO1xuXG4gICAgcG0ub24oXCJ0cmFuc2Zvcm1cIiwgZnVuY3Rpb24gKHRyYW5zZm9ybSwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIF90aGlzMy5yZWNvcmRUcmFuc2Zvcm0odHJhbnNmb3JtLCBvcHRpb25zKTtcbiAgICB9KTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhIaXN0b3J5LCBbe1xuICAgIGtleTogXCJyZWNvcmRUcmFuc2Zvcm1cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVjb3JkVHJhbnNmb3JtKHRyYW5zZm9ybSwgb3B0aW9ucykge1xuICAgICAgaWYgKHRoaXMuaWdub3JlVHJhbnNmb3JtKSByZXR1cm47XG5cbiAgICAgIGlmIChvcHRpb25zLmFkZFRvSGlzdG9yeSA9PSBmYWxzZSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyYW5zZm9ybS5tYXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIG1hcCA9IHRyYW5zZm9ybS5tYXBzW2ldO1xuICAgICAgICAgIHRoaXMuZG9uZS5hZGRNYXAobWFwKTtcbiAgICAgICAgICB0aGlzLnVuZG9uZS5hZGRNYXAobWFwKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy51bmRvbmUuY2xlYXIoKTtcbiAgICAgICAgdmFyIG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGlmIChub3cgPiB0aGlzLmxhc3RBZGRlZEF0ICsgdGhpcy5wbS5vcHRpb25zLmhpc3RvcnlFdmVudERlbGF5KSB0aGlzLmRvbmUubmV3RXZlbnQoKTtcblxuICAgICAgICB0aGlzLmRvbmUuYWRkVHJhbnNmb3JtKHRyYW5zZm9ybSk7XG4gICAgICAgIHRoaXMubGFzdEFkZGVkQXQgPSBub3c7XG4gICAgICB9XG4gICAgICB0aGlzLm1heWJlU2NoZWR1bGVDb21wcmVzc2lvbigpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1bmRvXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVuZG8oKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaGlmdCh0aGlzLmRvbmUsIHRoaXMudW5kb25lKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVkb1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZWRvKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2hpZnQodGhpcy51bmRvbmUsIHRoaXMuZG9uZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNhblVuZG9cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2FuVW5kbygpIHtcbiAgICAgIHJldHVybiB0aGlzLmRvbmUuZXZlbnRzLmxlbmd0aCA+IDA7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNhblJlZG9cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2FuUmVkbygpIHtcbiAgICAgIHJldHVybiB0aGlzLnVuZG9uZS5ldmVudHMubGVuZ3RoID4gMDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2hpZnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2hpZnQoZnJvbSwgdG8pIHtcbiAgICAgIHZhciBldmVudCA9IGZyb20ucG9wRXZlbnQodGhpcy5wbS5kb2MsIHRoaXMuYWxsb3dDb2xsYXBzaW5nKTtcbiAgICAgIGlmICghZXZlbnQpIHJldHVybiBmYWxzZTtcbiAgICAgIHZhciB0cmFuc2Zvcm0gPSBldmVudC50cmFuc2Zvcm07XG4gICAgICB2YXIgaWRzID0gZXZlbnQuaWRzO1xuXG4gICAgICB0aGlzLmlnbm9yZVRyYW5zZm9ybSA9IHRydWU7XG4gICAgICB0aGlzLnBtLmFwcGx5KHRyYW5zZm9ybSk7XG4gICAgICB0aGlzLmlnbm9yZVRyYW5zZm9ybSA9IGZhbHNlO1xuXG4gICAgICBpZiAoIXRyYW5zZm9ybS5zdGVwcy5sZW5ndGgpIHJldHVybiB0aGlzLnNoaWZ0KGZyb20sIHRvKTtcblxuICAgICAgaWYgKHRvKSB7XG4gICAgICAgIHRvLm5ld0V2ZW50KCk7XG4gICAgICAgIHRvLmFkZFRyYW5zZm9ybSh0cmFuc2Zvcm0sIGlkcyk7XG4gICAgICB9XG4gICAgICB0aGlzLmxhc3RBZGRlZEF0ID0gMDtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFZlcnNpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VmVyc2lvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLmRvbmUuZ2V0VmVyc2lvbigpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJiYWNrVG9WZXJzaW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJhY2tUb1ZlcnNpb24odmVyc2lvbikge1xuICAgICAgdmFyIGZvdW5kID0gdGhpcy5kb25lLmZpbmRWZXJzaW9uKHZlcnNpb24pO1xuICAgICAgaWYgKCFmb3VuZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgdmFyIGV2ZW50ID0gdGhpcy5kb25lLmV2ZW50c1tmb3VuZC5ldmVudF07XG4gICAgICB2YXIgY29tYmluZWQgPSB0aGlzLmRvbmUuZXZlbnRzLnNsaWNlKGZvdW5kLmV2ZW50ICsgMSkucmVkdWNlKGZ1bmN0aW9uIChjb21iLCBhcnIpIHtcbiAgICAgICAgcmV0dXJuIGNvbWIuY29uY2F0KGFycik7XG4gICAgICB9LCBldmVudC5zbGljZShmb3VuZC5zdGVwKSk7XG4gICAgICB0aGlzLmRvbmUuZXZlbnRzLmxlbmd0aCA9IGZvdW5kLmV2ZW50ICsgKChldmVudC5sZW5ndGggPSBmb3VuZC5zdGVwKSA/IDEgOiAwKTtcbiAgICAgIHRoaXMuZG9uZS5ldmVudHMucHVzaChjb21iaW5lZCk7XG5cbiAgICAgIHRoaXMuc2hpZnQodGhpcy5kb25lKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmViYXNlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZWJhc2VkKG5ld01hcHMsIHJlYmFzZWRUcmFuc2Zvcm0sIHBvc2l0aW9ucykge1xuICAgICAgdGhpcy5kb25lLnJlYmFzZWQobmV3TWFwcywgcmViYXNlZFRyYW5zZm9ybSwgcG9zaXRpb25zKTtcbiAgICAgIHRoaXMudW5kb25lLnJlYmFzZWQobmV3TWFwcywgcmViYXNlZFRyYW5zZm9ybSwgcG9zaXRpb25zKTtcbiAgICAgIHRoaXMubWF5YmVTY2hlZHVsZUNvbXByZXNzaW9uKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm1heWJlU2NoZWR1bGVDb21wcmVzc2lvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYXliZVNjaGVkdWxlQ29tcHJlc3Npb24oKSB7XG4gICAgICB0aGlzLm1heWJlU2NoZWR1bGVDb21wcmVzc2lvbkZvckJyYW5jaCh0aGlzLmRvbmUpO1xuICAgICAgdGhpcy5tYXliZVNjaGVkdWxlQ29tcHJlc3Npb25Gb3JCcmFuY2godGhpcy51bmRvbmUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJtYXliZVNjaGVkdWxlQ29tcHJlc3Npb25Gb3JCcmFuY2hcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWF5YmVTY2hlZHVsZUNvbXByZXNzaW9uRm9yQnJhbmNoKGJyYW5jaCkge1xuICAgICAgdmFyIF90aGlzNCA9IHRoaXM7XG5cbiAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoYnJhbmNoLmNvbXByZXNzVGltZW91dCk7XG4gICAgICBpZiAoYnJhbmNoLm5lZWRzQ29tcHJlc3Npb24oKSkgYnJhbmNoLmNvbXByZXNzVGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGJyYW5jaC5uZWVkc0NvbXByZXNzaW9uKCkpIGJyYW5jaC5zdGFydENvbXByZXNzaW9uKF90aGlzNC5wbS5kb2MpO1xuICAgICAgfSwgY29tcHJlc3NEZWxheSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEhpc3Rvcnk7XG59KSgpO1xuXG5leHBvcnRzLkhpc3RvcnkgPSBIaXN0b3J5OyIsIi8vICEhIFRoaXMgbW9kdWxlIGltcGxlbWVudHMgdGhlIFByb3NlTWlycm9yIGVkaXRvci4gSXQgY29udGFpbnNcbi8vIGZ1bmN0aW9uYWxpdHkgcmVsYXRlZCB0byBlZGl0aW5nLCBzZWxlY3Rpb24sIGFuZCBpbnRlZ3JhdGlvbiB3aXRoXG4vLyB0aGUgYnJvd3Nlci4gYFByb3NlTWlycm9yYCBpcyB0aGUgY2xhc3MgeW91J2xsIHdhbnQgdG8gaW5zdGFudGlhdGVcbi8vIGFuZCBpbnRlcmFjdCB3aXRoIHdoZW4gdXNpbmcgdGhlIGVkaXRvci5cblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfbWFpbiA9IHJlcXVpcmUoXCIuL21haW5cIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlByb3NlTWlycm9yXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9tYWluLlByb3NlTWlycm9yO1xuICB9XG59KTtcblxudmFyIF9vcHRpb25zID0gcmVxdWlyZShcIi4vb3B0aW9uc1wiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZGVmaW5lT3B0aW9uXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9vcHRpb25zLmRlZmluZU9wdGlvbjtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZWdpc3RyeVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfb3B0aW9ucy5SZWdpc3RyeTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJkZWZhdWx0UmVnaXN0cnlcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX29wdGlvbnMuZGVmYXVsdFJlZ2lzdHJ5O1xuICB9XG59KTtcblxudmFyIF9zZWxlY3Rpb24gPSByZXF1aXJlKFwiLi9zZWxlY3Rpb25cIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJhbmdlXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9zZWxlY3Rpb24uUmFuZ2U7XG4gIH1cbn0pO1xuXG52YXIgX2tleXMgPSByZXF1aXJlKFwiLi9rZXlzXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJLZXltYXBcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2tleXMuS2V5bWFwO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImtleU5hbWVcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2tleXMua2V5TmFtZTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJrZXlOYW1lc1wiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfa2V5cy5rZXlOYW1lcztcbiAgfVxufSk7XG5cbnZhciBfcmFuZ2UgPSByZXF1aXJlKFwiLi9yYW5nZVwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWFya2VkUmFuZ2VcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3JhbmdlLk1hcmtlZFJhbmdlO1xuICB9XG59KTtcblxudmFyIF9jb21tYW5kcyA9IHJlcXVpcmUoXCIuL2NvbW1hbmRzXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJkZWZpbmVDb21tYW5kXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9jb21tYW5kcy5kZWZpbmVDb21tYW5kO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImRlZmluZVBhcmFtSGFuZGxlclwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfY29tbWFuZHMuZGVmaW5lUGFyYW1IYW5kbGVyO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNvbW1hbmRcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2NvbW1hbmRzLkNvbW1hbmQ7XG4gIH1cbn0pOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbmV4cG9ydHMuZGlzcGF0Y2hLZXkgPSBkaXNwYXRjaEtleTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIF9tb2RlbCA9IHJlcXVpcmUoXCIuLi9tb2RlbFwiKTtcblxudmFyIF9wYXJzZURvbSA9IHJlcXVpcmUoXCIuLi9wYXJzZS9kb21cIik7XG5cbnZhciBfcGFyc2VUZXh0ID0gcmVxdWlyZShcIi4uL3BhcnNlL3RleHRcIik7XG5cbnZhciBfZG9tID0gcmVxdWlyZShcIi4uL2RvbVwiKTtcblxudmFyIF9zZXJpYWxpemVEb20gPSByZXF1aXJlKFwiLi4vc2VyaWFsaXplL2RvbVwiKTtcblxudmFyIF9zZXJpYWxpemVUZXh0ID0gcmVxdWlyZShcIi4uL3NlcmlhbGl6ZS90ZXh0XCIpO1xuXG52YXIgX3BhcnNlID0gcmVxdWlyZShcIi4uL3BhcnNlXCIpO1xuXG52YXIgX2tleXMgPSByZXF1aXJlKFwiLi9rZXlzXCIpO1xuXG52YXIgX2NhcHR1cmVrZXlzID0gcmVxdWlyZShcIi4vY2FwdHVyZWtleXNcIik7XG5cbnZhciBfZG9tY2hhbmdlID0gcmVxdWlyZShcIi4vZG9tY2hhbmdlXCIpO1xuXG52YXIgX3NlbGVjdGlvbiA9IHJlcXVpcmUoXCIuL3NlbGVjdGlvblwiKTtcblxudmFyIHN0b3BTZXEgPSBudWxsO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBET00gZXZlbnRzIHRoYXQgb2NjdXIgd2l0aGluIHRoZSBlZGl0b3IsIGFuZCBjYWxsYmFjayBmdW5jdGlvbnNcbiAqIHRvIGludm9rZSB3aGVuIHRoZSBldmVudCBmaXJlcy5cbiAqL1xudmFyIGhhbmRsZXJzID0ge307XG5cbnZhciBJbnB1dCA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIElucHV0KHBtKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBJbnB1dCk7XG5cbiAgICB0aGlzLnBtID0gcG07XG5cbiAgICB0aGlzLmtleVNlcSA9IG51bGw7XG5cbiAgICAvLyBXaGVuIHRoZSB1c2VyIGlzIGNyZWF0aW5nIGEgY29tcG9zZWQgY2hhcmFjdGVyLFxuICAgIC8vIHRoaXMgaXMgc2V0IHRvIGEgQ29tcG9zaW5nIGluc3RhbmNlLlxuICAgIHRoaXMuY29tcG9zaW5nID0gbnVsbDtcbiAgICB0aGlzLnNoaWZ0S2V5ID0gdGhpcy51cGRhdGluZ0NvbXBvc2l0aW9uID0gZmFsc2U7XG4gICAgdGhpcy5za2lwSW5wdXQgPSAwO1xuXG4gICAgdGhpcy5kcmFnZ2luZ0Zyb20gPSBmYWxzZTtcblxuICAgIHRoaXMua2V5bWFwcyA9IFtdO1xuICAgIHRoaXMuZGVmYXVsdEtleW1hcCA9IG51bGw7XG5cbiAgICB0aGlzLnN0b3JlZE1hcmtzID0gbnVsbDtcblxuICAgIHRoaXMuZHJvcFRhcmdldCA9IHBtLndyYXBwZXIuYXBwZW5kQ2hpbGQoKDAsIF9kb20uZWx0KShcImRpdlwiLCB7IFwiY2xhc3NcIjogXCJQcm9zZU1pcnJvci1kcm9wLXRhcmdldFwiIH0pKTtcblxuICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIChfZXZlbnQpIHtcbiAgICAgIHZhciBoYW5kbGVyID0gaGFuZGxlcnNbX2V2ZW50XTtcbiAgICAgIHBtLmNvbnRlbnQuYWRkRXZlbnRMaXN0ZW5lcihfZXZlbnQsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBoYW5kbGVyKHBtLCBlKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBmb3IgKHZhciBfZXZlbnQgaW4gaGFuZGxlcnMpIHtcbiAgICAgIF9sb29wKF9ldmVudCk7XG4gICAgfVxuXG4gICAgcG0ub24oXCJzZWxlY3Rpb25DaGFuZ2VcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLnN0b3JlZE1hcmtzID0gbnVsbDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBhIGtleSBwcmVzcyB0byB0aGUgaW50ZXJuYWwga2V5bWFwcywgd2hpY2ggd2lsbCBvdmVycmlkZSB0aGUgZGVmYXVsdFxuICAgKiBET00gYmVoYXZpb3IuXG4gICAqXG4gICAqIEBwYXJhbSAge1Byb3NlTWlycm9yfSAgIHBtIFRoZSBlZGl0b3IgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSAge3N0cmluZ30gICAgICAgIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGtleSBwcmVzc2VkLlxuICAgKiBAcGFyYW0gIHtLZXlib2FyZEV2ZW50fSBlXG4gICAqIEByZXR1cm4ge3N0cmluZ30gSWYgdGhlIGtleSBuYW1lIGhhcyBhIG1hcHBpbmcgYW5kIHRoZSBjYWxsYmFjayBpcyBpbnZva2VkIChcImhhbmRsZWRcIiksXG4gICAqICAgICAgICAgICAgICAgICAgaWYgdGhlIGtleSBuYW1lIG5lZWRzIHRvIGJlIGNvbWJpbmVkIGluIHNlcXVlbmNlIHdpdGggdGhlIG5leHQga2V5IChcIm11bHRpXCIpLFxuICAgKiAgICAgICAgICAgICAgICAgIGlmIHRoZXJlIGlzIG5vIG1hcHBpbmcgKFwibm90aGluZ1wiKS5cbiAgICovXG5cbiAgX2NyZWF0ZUNsYXNzKElucHV0LCBbe1xuICAgIGtleTogXCJtYXliZUFib3J0Q29tcG9zaXRpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWF5YmVBYm9ydENvbXBvc2l0aW9uKCkge1xuICAgICAgaWYgKHRoaXMuY29tcG9zaW5nICYmICF0aGlzLnVwZGF0aW5nQ29tcG9zaXRpb24pIHtcbiAgICAgICAgaWYgKHRoaXMuY29tcG9zaW5nLmZpbmlzaGVkKSB7XG4gICAgICAgICAgZmluaXNoQ29tcG9zaW5nKHRoaXMucG0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFRvZ2dsZSBzZWxlY3Rpb24gdG8gZm9yY2UgZW5kIG9mIGNvbXBvc2l0aW9uXG4gICAgICAgICAgdGhpcy5jb21wb3NpbmcgPSBudWxsO1xuICAgICAgICAgIHRoaXMuc2tpcElucHV0Kys7XG4gICAgICAgICAgdmFyIHNlbCA9IGdldFNlbGVjdGlvbigpO1xuICAgICAgICAgIGlmIChzZWwucmFuZ2VDb3VudCkge1xuICAgICAgICAgICAgdmFyIHJhbmdlID0gc2VsLmdldFJhbmdlQXQoMCk7XG4gICAgICAgICAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgICAgICBzZWwuYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gSW5wdXQ7XG59KSgpO1xuXG5leHBvcnRzLklucHV0ID0gSW5wdXQ7XG5cbmZ1bmN0aW9uIGRpc3BhdGNoS2V5KHBtLCBuYW1lLCBlKSB7XG4gIHZhciBzZXEgPSBwbS5pbnB1dC5rZXlTZXE7XG4gIC8vIElmIHRoZSBwcmV2aW91cyBrZXkgc2hvdWxkIGJlIHVzZWQgaW4gc2VxdWVuY2Ugd2l0aCB0aGlzIG9uZSwgbW9kaWZ5IHRoZSBuYW1lIGFjY29yZGluZ2x5LlxuICBpZiAoc2VxKSB7XG4gICAgaWYgKCgwLCBfa2V5cy5pc01vZGlmaWVyS2V5KShuYW1lKSkgcmV0dXJuIHRydWU7XG4gICAgY2xlYXJUaW1lb3V0KHN0b3BTZXEpO1xuICAgIHN0b3BTZXEgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChwbS5pbnB1dC5rZXlTZXEgPT0gc2VxKSBwbS5pbnB1dC5rZXlTZXEgPSBudWxsO1xuICAgIH0sIDUwKTtcbiAgICBuYW1lID0gc2VxICsgXCIgXCIgKyBuYW1lO1xuICB9XG5cbiAgdmFyIGhhbmRsZSA9IGZ1bmN0aW9uIGhhbmRsZShib3VuZCkge1xuICAgIGlmIChib3VuZCA9PT0gZmFsc2UpIHJldHVybiBcIm5vdGhpbmdcIjtcbiAgICBpZiAoYm91bmQgPT0gXCIuLi5cIikgcmV0dXJuIFwibXVsdGlcIjtcbiAgICBpZiAoYm91bmQgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgdmFyIHJlc3VsdCA9IGZhbHNlO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGJvdW5kKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IHJlc3VsdCA9PT0gZmFsc2UgJiYgaSA8IGJvdW5kLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlc3VsdCA9IGhhbmRsZShib3VuZFtpXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYm91bmQgPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmVzdWx0ID0gcG0uZXhlY0NvbW1hbmQoYm91bmQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBib3VuZChwbSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQgPT0gZmFsc2UgPyBmYWxzZSA6IFwiaGFuZGxlZFwiO1xuICB9O1xuXG4gIHZhciByZXN1bHQgPSB1bmRlZmluZWQ7XG4gIGZvciAodmFyIGkgPSAwOyAhcmVzdWx0ICYmIGkgPCBwbS5pbnB1dC5rZXltYXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgcmVzdWx0ID0gaGFuZGxlKHBtLmlucHV0LmtleW1hcHNbaV0ubWFwLmxvb2t1cChuYW1lLCBwbSkpO1xuICB9aWYgKCFyZXN1bHQpIHJlc3VsdCA9IGhhbmRsZShwbS5iYXNlS2V5bWFwLmxvb2t1cChuYW1lLCBwbSkpIHx8IGhhbmRsZShfY2FwdHVyZWtleXMuY2FwdHVyZUtleXMubG9va3VwKG5hbWUpKTtcblxuICAvLyBJZiB0aGUga2V5IHNob3VsZCBiZSB1c2VkIGluIHNlcXVlbmNlIHdpdGggdGhlIG5leHQga2V5LCBzdG9yZSB0aGUga2V5bmFtZSBpbnRlcm5hbGx5LlxuICBpZiAocmVzdWx0ID09IFwibXVsdGlcIikgcG0uaW5wdXQua2V5U2VxID0gbmFtZTtcblxuICBpZiAocmVzdWx0ID09IFwiaGFuZGxlZFwiIHx8IHJlc3VsdCA9PSBcIm11bHRpXCIpIGUucHJldmVudERlZmF1bHQoKTtcblxuICBpZiAoc2VxICYmICFyZXN1bHQgJiYgL1xcJyQvLnRlc3QobmFtZSkpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuICEhcmVzdWx0O1xufVxuXG5oYW5kbGVycy5rZXlkb3duID0gZnVuY3Rpb24gKHBtLCBlKSB7XG4gIGlmIChlLmtleUNvZGUgPT0gMTYpIHBtLmlucHV0LnNoaWZ0S2V5ID0gdHJ1ZTtcbiAgaWYgKHBtLmlucHV0LmNvbXBvc2luZykgcmV0dXJuO1xuICB2YXIgbmFtZSA9ICgwLCBfa2V5cy5rZXlOYW1lKShlKTtcbiAgaWYgKG5hbWUgJiYgZGlzcGF0Y2hLZXkocG0sIG5hbWUsIGUpKSByZXR1cm47XG4gIHBtLnNlbC5wb2xsRm9yVXBkYXRlKCk7XG59O1xuXG5oYW5kbGVycy5rZXl1cCA9IGZ1bmN0aW9uIChwbSwgZSkge1xuICBpZiAoZS5rZXlDb2RlID09IDE2KSBwbS5pbnB1dC5zaGlmdEtleSA9IGZhbHNlO1xufTtcblxuZnVuY3Rpb24gaW5wdXRUZXh0KHBtLCByYW5nZSwgdGV4dCkge1xuICBpZiAocmFuZ2UuZW1wdHkgJiYgIXRleHQpIHJldHVybiBmYWxzZTtcbiAgdmFyIG1hcmtzID0gcG0uaW5wdXQuc3RvcmVkTWFya3MgfHwgcG0uZG9jLm1hcmtzQXQocmFuZ2UuZnJvbSk7XG4gIHZhciB0ciA9IHBtLnRyO1xuICB0ci5yZXBsYWNlV2l0aChyYW5nZS5mcm9tLCByYW5nZS50bywgcG0uc2NoZW1hLnRleHQodGV4dCwgbWFya3MpKS5hcHBseSgpO1xuICBwbS5zY3JvbGxJbnRvVmlldygpO1xuICAvLyA6OiAoKSAjcGF0aD1Qcm9zZU1pcnJvciNldmVudHMjdGV4dElucHV0XG4gIC8vIEZpcmVkIHdoZW4gdGhlIHVzZXIgdHlwZXMgdGV4dCBpbnRvIHRoZSBlZGl0b3IuXG4gIHBtLnNpZ25hbChcInRleHRJbnB1dFwiLCB0ZXh0KTtcbn1cblxuaGFuZGxlcnMua2V5cHJlc3MgPSBmdW5jdGlvbiAocG0sIGUpIHtcbiAgaWYgKHBtLmlucHV0LmNvbXBvc2luZyB8fCAhZS5jaGFyQ29kZSB8fCBlLmN0cmxLZXkgJiYgIWUuYWx0S2V5IHx8IF9kb20uYnJvd3Nlci5tYWMgJiYgZS5tZXRhS2V5KSByZXR1cm47XG4gIHZhciBjaCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoZS5jaGFyQ29kZSk7XG4gIGlmIChkaXNwYXRjaEtleShwbSwgXCInXCIgKyBjaCArIFwiJ1wiLCBlKSkgcmV0dXJuO1xuICB2YXIgc2VsID0gcG0uc2VsZWN0aW9uO1xuICBpZiAoc2VsLm5vZGUgJiYgc2VsLm5vZGUuY29udGFpbnMgPT0gbnVsbCkge1xuICAgIHBtLnRyW1wiZGVsZXRlXCJdKHNlbC5mcm9tLCBzZWwudG8pLmFwcGx5KCk7XG4gICAgc2VsID0gcG0uc2VsZWN0aW9uO1xuICB9XG4gIGlucHV0VGV4dChwbSwgc2VsLCBjaCk7XG4gIGUucHJldmVudERlZmF1bHQoKTtcbn07XG5cbmZ1bmN0aW9uIHNlbGVjdENsaWNrZWROb2RlKHBtLCBlKSB7XG4gIHZhciBwb3MgPSAoMCwgX3NlbGVjdGlvbi5zZWxlY3RhYmxlTm9kZUFib3ZlKShwbSwgZS50YXJnZXQsIHsgbGVmdDogZS5jbGllbnRYLCB0b3A6IGUuY2xpZW50WSB9LCB0cnVlKTtcbiAgaWYgKCFwb3MpIHJldHVybiBwbS5zZWwucG9sbEZvclVwZGF0ZSgpO1xuXG4gIHZhciBfcG0kc2VsZWN0aW9uID0gcG0uc2VsZWN0aW9uO1xuICB2YXIgbm9kZSA9IF9wbSRzZWxlY3Rpb24ubm9kZTtcbiAgdmFyIGZyb20gPSBfcG0kc2VsZWN0aW9uLmZyb207XG5cbiAgaWYgKG5vZGUgJiYgcG9zLmRlcHRoID49IGZyb20uZGVwdGggJiYgcG9zLnNob3J0ZW4oZnJvbS5kZXB0aCkuY21wKGZyb20pID09IDApIHtcbiAgICBpZiAoZnJvbS5kZXB0aCA9PSAwKSByZXR1cm4gcG0uc2VsLnBvbGxGb3JVcGRhdGUoKTtcbiAgICBwb3MgPSBmcm9tLnNob3J0ZW4oKTtcbiAgfVxuXG4gIHBtLnNldE5vZGVTZWxlY3Rpb24ocG9zKTtcbiAgcG0uZm9jdXMoKTtcbiAgZS5wcmV2ZW50RGVmYXVsdCgpO1xufVxuXG52YXIgbGFzdENsaWNrID0gMDtcblxuaGFuZGxlcnMubW91c2Vkb3duID0gZnVuY3Rpb24gKHBtLCBlKSB7XG4gIGlmIChlLmN0cmxLZXkpIHJldHVybiBzZWxlY3RDbGlja2VkTm9kZShwbSwgZSk7XG5cbiAgcG0uc2VsLnBvbGxGb3JVcGRhdGUoKTtcblxuICB2YXIgbm93ID0gRGF0ZS5ub3coKSxcbiAgICAgIG11bHRpID0gbm93IC0gbGFzdENsaWNrIDwgNTAwO1xuICBsYXN0Q2xpY2sgPSBub3c7XG4gIGlmIChwbS5pbnB1dC5zaGlmdEtleSB8fCBtdWx0aSkgcmV0dXJuO1xuXG4gIHZhciB4ID0gZS5jbGllbnRYLFxuICAgICAgeSA9IGUuY2xpZW50WSxcbiAgICAgIG1vdmVkID0gZmFsc2U7XG4gIHZhciB1cCA9IGZ1bmN0aW9uIHVwKCkge1xuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIHVwKTtcbiAgICByZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIG1vdmUpO1xuICAgIGlmICgoMCwgX3NlbGVjdGlvbi5oYW5kbGVOb2RlQ2xpY2spKHBtLCBlKSkgcmV0dXJuO1xuXG4gICAgdmFyIHBvcyA9ICFtb3ZlZCAmJiAoMCwgX3NlbGVjdGlvbi5zZWxlY3RhYmxlTm9kZUFib3ZlKShwbSwgZS50YXJnZXQsIHsgbGVmdDogZS5jbGllbnRYLCB0b3A6IGUuY2xpZW50WSB9KTtcbiAgICBpZiAocG9zKSB7XG4gICAgICBwbS5zZXROb2RlU2VsZWN0aW9uKHBvcyk7XG4gICAgICBwbS5mb2N1cygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwbS5zZWwucG9sbEZvclVwZGF0ZSgpO1xuICAgIH1cbiAgfTtcbiAgdmFyIG1vdmUgPSBmdW5jdGlvbiBtb3ZlKGUpIHtcbiAgICBpZiAoIW1vdmVkICYmIChNYXRoLmFicyh4IC0gZS5jbGllbnRYKSA+IDQgfHwgTWF0aC5hYnMoeSAtIGUuY2xpZW50WSkgPiA0KSkgbW92ZWQgPSB0cnVlO1xuICAgIHBtLnNlbC5wb2xsRm9yVXBkYXRlKCk7XG4gIH07XG4gIGFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIHVwKTtcbiAgYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCBtb3ZlKTtcbn07XG5cbmhhbmRsZXJzLnRvdWNoZG93biA9IGZ1bmN0aW9uIChwbSkge1xuICBwbS5zZWwucG9sbEZvclVwZGF0ZSgpO1xufTtcblxuLyoqXG4gKiBBIGNsYXNzIHRvIHRyYWNrIHN0YXRlIHdoaWxlIGNyZWF0aW5nIGEgY29tcG9zZWQgY2hhcmFjdGVyLlxuICovXG5cbnZhciBDb21wb3NpbmcgPSBmdW5jdGlvbiBDb21wb3NpbmcocG0sIGRhdGEpIHtcbiAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENvbXBvc2luZyk7XG5cbiAgdGhpcy5maW5pc2hlZCA9IGZhbHNlO1xuICB0aGlzLmNvbnRleHQgPSAoMCwgX2RvbWNoYW5nZS50ZXh0Q29udGV4dCkoZGF0YSk7XG4gIHRoaXMuZGF0YSA9IGRhdGE7XG4gIHRoaXMuZW5kRGF0YSA9IG51bGw7XG4gIHZhciByYW5nZSA9IHBtLnNlbGVjdGlvbjtcbiAgaWYgKGRhdGEpIHtcbiAgICB2YXIgcGF0aCA9IHJhbmdlLmhlYWQucGF0aCxcbiAgICAgICAgbGluZSA9IHBtLmRvYy5wYXRoKHBhdGgpLnRleHRDb250ZW50O1xuICAgIHZhciBmb3VuZCA9IGxpbmUuaW5kZXhPZihkYXRhLCByYW5nZS5oZWFkLm9mZnNldCAtIGRhdGEubGVuZ3RoKTtcbiAgICBpZiAoZm91bmQgPiAtMSAmJiBmb3VuZCA8PSByYW5nZS5oZWFkLm9mZnNldCArIGRhdGEubGVuZ3RoKSByYW5nZSA9IG5ldyBfc2VsZWN0aW9uLlRleHRTZWxlY3Rpb24obmV3IF9tb2RlbC5Qb3MocGF0aCwgZm91bmQpLCBuZXcgX21vZGVsLlBvcyhwYXRoLCBmb3VuZCArIGRhdGEubGVuZ3RoKSk7XG4gIH1cbiAgdGhpcy5yYW5nZSA9IHJhbmdlO1xufTtcblxuaGFuZGxlcnMuY29tcG9zaXRpb25zdGFydCA9IGZ1bmN0aW9uIChwbSwgZSkge1xuICBpZiAocG0uaW5wdXQubWF5YmVBYm9ydENvbXBvc2l0aW9uKCkpIHJldHVybjtcblxuICBwbS5mbHVzaCgpO1xuICBwbS5pbnB1dC5jb21wb3NpbmcgPSBuZXcgQ29tcG9zaW5nKHBtLCBlLmRhdGEpO1xuICB2YXIgYWJvdmUgPSBwbS5zZWxlY3Rpb24uaGVhZC5zaG9ydGVuKCk7XG4gIHBtLm1hcmtSYW5nZURpcnR5KHsgZnJvbTogYWJvdmUsIHRvOiBhYm92ZS5tb3ZlKDEpIH0pO1xufTtcblxuaGFuZGxlcnMuY29tcG9zaXRpb251cGRhdGUgPSBmdW5jdGlvbiAocG0sIGUpIHtcbiAgdmFyIGluZm8gPSBwbS5pbnB1dC5jb21wb3Npbmc7XG4gIGlmIChpbmZvICYmIGluZm8uZGF0YSAhPSBlLmRhdGEpIHtcbiAgICBpbmZvLmRhdGEgPSBlLmRhdGE7XG4gICAgcG0uaW5wdXQudXBkYXRpbmdDb21wb3NpdGlvbiA9IHRydWU7XG4gICAgaW5wdXRUZXh0KHBtLCBpbmZvLnJhbmdlLCBpbmZvLmRhdGEpO1xuICAgIHBtLmlucHV0LnVwZGF0aW5nQ29tcG9zaXRpb24gPSBmYWxzZTtcbiAgICBpbmZvLnJhbmdlID0gbmV3IF9zZWxlY3Rpb24uVGV4dFNlbGVjdGlvbihpbmZvLnJhbmdlLmZyb20sIGluZm8ucmFuZ2UuZnJvbS5tb3ZlKGluZm8uZGF0YS5sZW5ndGgpKTtcbiAgfVxufTtcblxuaGFuZGxlcnMuY29tcG9zaXRpb25lbmQgPSBmdW5jdGlvbiAocG0sIGUpIHtcbiAgdmFyIGluZm8gPSBwbS5pbnB1dC5jb21wb3Npbmc7XG4gIGlmIChpbmZvKSB7XG4gICAgcG0uaW5wdXQuY29tcG9zaW5nLmZpbmlzaGVkID0gdHJ1ZTtcbiAgICBwbS5pbnB1dC5jb21wb3NpbmcuZW5kRGF0YSA9IGUuZGF0YTtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChwbS5pbnB1dC5jb21wb3NpbmcgPT0gaW5mbykgZmluaXNoQ29tcG9zaW5nKHBtKTtcbiAgICB9LCAyMCk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGZpbmlzaENvbXBvc2luZyhwbSkge1xuICB2YXIgaW5mbyA9IHBtLmlucHV0LmNvbXBvc2luZztcbiAgdmFyIHRleHQgPSAoMCwgX2RvbWNoYW5nZS50ZXh0SW5Db250ZXh0KShpbmZvLmNvbnRleHQsIGluZm8uZW5kRGF0YSk7XG4gIHZhciByYW5nZSA9ICgwLCBfc2VsZWN0aW9uLnJhbmdlRnJvbURPTUxvb3NlKShwbSk7XG4gIHBtLmVuc3VyZU9wZXJhdGlvbigpO1xuICBwbS5pbnB1dC5jb21wb3NpbmcgPSBudWxsO1xuICBpZiAodGV4dCAhPSBpbmZvLmRhdGEpIGlucHV0VGV4dChwbSwgaW5mby5yYW5nZSwgdGV4dCk7XG4gIGlmIChyYW5nZSAmJiAhcmFuZ2UuZXEocG0uc2VsLnJhbmdlKSkgcG0uc2V0U2VsZWN0aW9uRGlyZWN0KHJhbmdlKTtcbn1cblxuaGFuZGxlcnMuaW5wdXQgPSBmdW5jdGlvbiAocG0pIHtcbiAgaWYgKHBtLmlucHV0LnNraXBJbnB1dCkgcmV0dXJuIC0tcG0uaW5wdXQuc2tpcElucHV0O1xuXG4gIGlmIChwbS5pbnB1dC5jb21wb3NpbmcpIHtcbiAgICBpZiAocG0uaW5wdXQuY29tcG9zaW5nLmZpbmlzaGVkKSBmaW5pc2hDb21wb3NpbmcocG0pO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHBtLnNlbC5zdG9wUG9sbGluZ0ZvclVwZGF0ZSgpO1xuICAoMCwgX2RvbWNoYW5nZS5hcHBseURPTUNoYW5nZSkocG0pO1xuICBwbS5zY3JvbGxJbnRvVmlldygpO1xufTtcblxudmFyIGxhc3RDb3BpZWQgPSBudWxsO1xuXG5oYW5kbGVycy5jb3B5ID0gaGFuZGxlcnMuY3V0ID0gZnVuY3Rpb24gKHBtLCBlKSB7XG4gIHZhciBfcG0kc2VsZWN0aW9uMiA9IHBtLnNlbGVjdGlvbjtcbiAgdmFyIGZyb20gPSBfcG0kc2VsZWN0aW9uMi5mcm9tO1xuICB2YXIgdG8gPSBfcG0kc2VsZWN0aW9uMi50bztcbiAgdmFyIGVtcHR5ID0gX3BtJHNlbGVjdGlvbjIuZW1wdHk7XG5cbiAgaWYgKGVtcHR5KSByZXR1cm47XG4gIHZhciBmcmFnbWVudCA9IHBtLnNlbGVjdGVkRG9jO1xuICBsYXN0Q29waWVkID0geyBkb2M6IHBtLmRvYywgZnJvbTogZnJvbSwgdG86IHRvLFxuICAgIGh0bWw6ICgwLCBfc2VyaWFsaXplRG9tLnRvSFRNTCkoZnJhZ21lbnQpLFxuICAgIHRleHQ6ICgwLCBfc2VyaWFsaXplVGV4dC50b1RleHQpKGZyYWdtZW50KSB9O1xuXG4gIGlmIChlLmNsaXBib2FyZERhdGEpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5jbGlwYm9hcmREYXRhLmNsZWFyRGF0YSgpO1xuICAgIGUuY2xpcGJvYXJkRGF0YS5zZXREYXRhKFwidGV4dC9odG1sXCIsIGxhc3RDb3BpZWQuaHRtbCk7XG4gICAgZS5jbGlwYm9hcmREYXRhLnNldERhdGEoXCJ0ZXh0L3BsYWluXCIsIGxhc3RDb3BpZWQudGV4dCk7XG4gICAgaWYgKGUudHlwZSA9PSBcImN1dFwiICYmICFlbXB0eSkgcG0udHJbXCJkZWxldGVcIl0oZnJvbSwgdG8pLmFwcGx5KCk7XG4gIH1cbn07XG5cbmhhbmRsZXJzLnBhc3RlID0gZnVuY3Rpb24gKHBtLCBlKSB7XG4gIGlmICghZS5jbGlwYm9hcmREYXRhKSByZXR1cm47XG4gIHZhciBzZWwgPSBwbS5zZWxlY3Rpb247XG4gIHZhciB0eHQgPSBlLmNsaXBib2FyZERhdGEuZ2V0RGF0YShcInRleHQvcGxhaW5cIik7XG4gIHZhciBodG1sID0gZS5jbGlwYm9hcmREYXRhLmdldERhdGEoXCJ0ZXh0L2h0bWxcIik7XG4gIGlmIChodG1sIHx8IHR4dCkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB2YXIgZG9jID0gdW5kZWZpbmVkLFxuICAgICAgICBmcm9tID0gdW5kZWZpbmVkLFxuICAgICAgICB0byA9IHVuZGVmaW5lZDtcbiAgICBpZiAocG0uaW5wdXQuc2hpZnRLZXkgJiYgdHh0KSB7XG4gICAgICBkb2MgPSAoMCwgX3BhcnNlVGV4dC5mcm9tVGV4dCkocG0uc2NoZW1hLCB0eHQpO1xuICAgIH0gZWxzZSBpZiAobGFzdENvcGllZCAmJiAobGFzdENvcGllZC5odG1sID09IGh0bWwgfHwgbGFzdENvcGllZC50ZXh0ID09IHR4dCkpIHtcbiAgICAgIDt2YXIgX2xhc3RDb3BpZWQgPSBsYXN0Q29waWVkO1xuICAgICAgZG9jID0gX2xhc3RDb3BpZWQuZG9jO1xuICAgICAgZnJvbSA9IF9sYXN0Q29waWVkLmZyb207XG4gICAgICB0byA9IF9sYXN0Q29waWVkLnRvO1xuICAgIH0gZWxzZSBpZiAoaHRtbCkge1xuICAgICAgZG9jID0gKDAsIF9wYXJzZURvbS5mcm9tSFRNTCkocG0uc2NoZW1hLCBodG1sKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZG9jID0gKDAsIF9wYXJzZS5wYXJzZUZyb20pKHBtLnNjaGVtYSwgdHh0LCAoMCwgX3BhcnNlLmtub3duU291cmNlKShcIm1hcmtkb3duXCIpID8gXCJtYXJrZG93blwiIDogXCJ0ZXh0XCIpO1xuICAgIH1cbiAgICBwbS50ci5yZXBsYWNlKHNlbC5mcm9tLCBzZWwudG8sIGRvYywgZnJvbSB8fCAoMCwgX3NlbGVjdGlvbi5maW5kU2VsZWN0aW9uQXRTdGFydCkoZG9jKS5mcm9tLCB0byB8fCAoMCwgX3NlbGVjdGlvbi5maW5kU2VsZWN0aW9uQXRFbmQpKGRvYykudG8pLmFwcGx5KCk7XG4gICAgcG0uc2Nyb2xsSW50b1ZpZXcoKTtcbiAgfVxufTtcblxuaGFuZGxlcnMuZHJhZ3N0YXJ0ID0gZnVuY3Rpb24gKHBtLCBlKSB7XG4gIGlmICghZS5kYXRhVHJhbnNmZXIpIHJldHVybjtcblxuICB2YXIgZnJhZ21lbnQgPSBwbS5zZWxlY3RlZERvYztcblxuICBlLmRhdGFUcmFuc2Zlci5zZXREYXRhKFwidGV4dC9odG1sXCIsICgwLCBfc2VyaWFsaXplRG9tLnRvSFRNTCkoZnJhZ21lbnQpKTtcbiAgZS5kYXRhVHJhbnNmZXIuc2V0RGF0YShcInRleHQvcGxhaW5cIiwgKDAsIF9zZXJpYWxpemVUZXh0LnRvVGV4dCkoZnJhZ21lbnQpKTtcbiAgcG0uaW5wdXQuZHJhZ2dpbmdGcm9tID0gdHJ1ZTtcbn07XG5cbmhhbmRsZXJzLmRyYWdlbmQgPSBmdW5jdGlvbiAocG0pIHtcbiAgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gcG0uaW5wdXQuZHJhZ2dpbkZyb20gPSBmYWxzZTtcbiAgfSwgNTApO1xufTtcblxuaGFuZGxlcnMuZHJhZ292ZXIgPSBoYW5kbGVycy5kcmFnZW50ZXIgPSBmdW5jdGlvbiAocG0sIGUpIHtcbiAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICB2YXIgY3Vyc29yUG9zID0gcG0ucG9zQXRDb29yZHMoeyBsZWZ0OiBlLmNsaWVudFgsIHRvcDogZS5jbGllbnRZIH0pO1xuICBpZiAoIWN1cnNvclBvcykgcmV0dXJuO1xuICB2YXIgY29vcmRzID0gKDAsIF9zZWxlY3Rpb24uY29vcmRzQXRQb3MpKHBtLCBjdXJzb3JQb3MpO1xuICB2YXIgcmVjdCA9IHBtLndyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIGNvb3Jkcy50b3AgLT0gcmVjdC50b3A7XG4gIGNvb3Jkcy5yaWdodCAtPSByZWN0LmxlZnQ7XG4gIGNvb3Jkcy5ib3R0b20gLT0gcmVjdC50b3A7XG4gIGNvb3Jkcy5sZWZ0IC09IHJlY3QubGVmdDtcbiAgdmFyIHRhcmdldCA9IHBtLmlucHV0LmRyb3BUYXJnZXQ7XG4gIHRhcmdldC5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICB0YXJnZXQuc3R5bGUubGVmdCA9IGNvb3Jkcy5sZWZ0IC0gMSArIFwicHhcIjtcbiAgdGFyZ2V0LnN0eWxlLnRvcCA9IGNvb3Jkcy50b3AgKyBcInB4XCI7XG4gIHRhcmdldC5zdHlsZS5oZWlnaHQgPSBjb29yZHMuYm90dG9tIC0gY29vcmRzLnRvcCArIFwicHhcIjtcbn07XG5cbmhhbmRsZXJzLmRyYWdsZWF2ZSA9IGZ1bmN0aW9uIChwbSkge1xuICByZXR1cm4gcG0uaW5wdXQuZHJvcFRhcmdldC5zdHlsZS5kaXNwbGF5ID0gXCJcIjtcbn07XG5cbmhhbmRsZXJzLmRyb3AgPSBmdW5jdGlvbiAocG0sIGUpIHtcbiAgcG0uaW5wdXQuZHJvcFRhcmdldC5zdHlsZS5kaXNwbGF5ID0gXCJcIjtcblxuICBpZiAoIWUuZGF0YVRyYW5zZmVyKSByZXR1cm47XG5cbiAgdmFyIGh0bWwgPSB1bmRlZmluZWQsXG4gICAgICB0eHQgPSB1bmRlZmluZWQsXG4gICAgICBkb2MgPSB1bmRlZmluZWQ7XG4gIGlmIChodG1sID0gZS5kYXRhVHJhbnNmZXIuZ2V0RGF0YShcInRleHQvaHRtbFwiKSkgZG9jID0gKDAsIF9wYXJzZURvbS5mcm9tSFRNTCkocG0uc2NoZW1hLCBodG1sLCB7IGRvY3VtZW50OiBkb2N1bWVudCB9KTtlbHNlIGlmICh0eHQgPSBlLmRhdGFUcmFuc2Zlci5nZXREYXRhKFwidGV4dC9wbGFpblwiKSkgZG9jID0gKDAsIF9wYXJzZS5wYXJzZUZyb20pKHBtLnNjaGVtYSwgdHh0LCAoMCwgX3BhcnNlLmtub3duU291cmNlKShcIm1hcmtkb3duXCIpID8gXCJtYXJrZG93blwiIDogXCJ0ZXh0XCIpO1xuXG4gIGlmIChkb2MpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgdmFyIGluc2VydFBvcyA9IHBtLnBvc0F0Q29vcmRzKHsgbGVmdDogZS5jbGllbnRYLCB0b3A6IGUuY2xpZW50WSB9KTtcbiAgICBpZiAoIWluc2VydFBvcykgcmV0dXJuO1xuICAgIHZhciB0ciA9IHBtLnRyO1xuICAgIGlmIChwbS5pbnB1dC5kcmFnZ2luZ0Zyb20gJiYgIWUuY3RybEtleSkge1xuICAgICAgdHIuZGVsZXRlU2VsZWN0aW9uKCk7XG4gICAgICBpbnNlcnRQb3MgPSB0ci5tYXAoaW5zZXJ0UG9zKS5wb3M7XG4gICAgfVxuICAgIHRyLnJlcGxhY2UoaW5zZXJ0UG9zLCBpbnNlcnRQb3MsIGRvYywgKDAsIF9zZWxlY3Rpb24uZmluZFNlbGVjdGlvbkF0U3RhcnQpKGRvYykuZnJvbSwgKDAsIF9zZWxlY3Rpb24uZmluZFNlbGVjdGlvbkF0RW5kKShkb2MpLnRvKS5hcHBseSgpO1xuICAgIHBtLnNldFRleHRTZWxlY3Rpb24oaW5zZXJ0UG9zLCB0ci5tYXAoaW5zZXJ0UG9zKS5wb3MpO1xuICAgIHBtLmZvY3VzKCk7XG4gIH1cbn07XG5cbmhhbmRsZXJzLmZvY3VzID0gZnVuY3Rpb24gKHBtKSB7XG4gICgwLCBfZG9tLmFkZENsYXNzKShwbS53cmFwcGVyLCBcIlByb3NlTWlycm9yLWZvY3VzZWRcIik7XG4gIC8vIDo6ICgpICNwYXRoPVByb3NlTWlycm9yI2V2ZW50cyNmb2N1c1xuICAvLyBGaXJlZCB3aGVuIHRoZSBlZGl0b3IgZ2FpbnMgZm9jdXMuXG4gIHBtLnNpZ25hbChcImZvY3VzXCIpO1xufTtcblxuaGFuZGxlcnMuYmx1ciA9IGZ1bmN0aW9uIChwbSkge1xuICAoMCwgX2RvbS5ybUNsYXNzKShwbS53cmFwcGVyLCBcIlByb3NlTWlycm9yLWZvY3VzZWRcIik7XG4gIC8vIDo6ICgpICNwYXRoPVByb3NlTWlycm9yI2V2ZW50cyNibHVyXG4gIC8vIEZpcmVkIHdoZW4gdGhlIGVkaXRvciBsb3NlcyBmb2N1cy5cbiAgcG0uc2lnbmFsKFwiYmx1clwiKTtcbn07IiwiLy8gRnJvbSBDb2RlTWlycm9yLCBzaG91bGQgYmUgZmFjdG9yZWQgaW50byBpdHMgb3duIE5QTSBtb2R1bGVcblxuLy8gZGVjbGFyZV9nbG9iYWw6IG5hdmlnYXRvclxuXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZXhwb3J0cy5rZXlOYW1lID0ga2V5TmFtZTtcbmV4cG9ydHMuaXNNb2RpZmllcktleSA9IGlzTW9kaWZpZXJLZXk7XG5leHBvcnRzLm5vcm1hbGl6ZUtleU5hbWUgPSBub3JtYWxpemVLZXlOYW1lO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgbWFjID0gdHlwZW9mIG5hdmlnYXRvciAhPSBcInVuZGVmaW5lZFwiID8gL01hYy8udGVzdChuYXZpZ2F0b3IucGxhdGZvcm0pIDogZmFsc2U7XG5cbi8vIDo6IE9iamVjdDxzdHJpbmc+XG4vLyBBIG1hcCBmcm9tIGtleSBjb2RlcyB0byBrZXkgbmFtZXMuXG52YXIga2V5TmFtZXMgPSB7XG4gIDM6IFwiRW50ZXJcIiwgODogXCJCYWNrc3BhY2VcIiwgOTogXCJUYWJcIiwgMTM6IFwiRW50ZXJcIiwgMTY6IFwiU2hpZnRcIiwgMTc6IFwiQ3RybFwiLCAxODogXCJBbHRcIixcbiAgMTk6IFwiUGF1c2VcIiwgMjA6IFwiQ2Fwc0xvY2tcIiwgMjc6IFwiRXNjXCIsIDMyOiBcIlNwYWNlXCIsIDMzOiBcIlBhZ2VVcFwiLCAzNDogXCJQYWdlRG93blwiLCAzNTogXCJFbmRcIixcbiAgMzY6IFwiSG9tZVwiLCAzNzogXCJMZWZ0XCIsIDM4OiBcIlVwXCIsIDM5OiBcIlJpZ2h0XCIsIDQwOiBcIkRvd25cIiwgNDQ6IFwiUHJpbnRTY3JuXCIsIDQ1OiBcIkluc2VydFwiLFxuICA0NjogXCJEZWxldGVcIiwgNTk6IFwiO1wiLCA2MTogXCI9XCIsIDkxOiBcIk1vZFwiLCA5MjogXCJNb2RcIiwgOTM6IFwiTW9kXCIsXG4gIDEwNjogXCIqXCIsIDEwNzogXCI9XCIsIDEwOTogXCItXCIsIDExMDogXCIuXCIsIDExMTogXCIvXCIsIDEyNzogXCJEZWxldGVcIixcbiAgMTczOiBcIi1cIiwgMTg2OiBcIjtcIiwgMTg3OiBcIj1cIiwgMTg4OiBcIixcIiwgMTg5OiBcIi1cIiwgMTkwOiBcIi5cIiwgMTkxOiBcIi9cIiwgMTkyOiBcImBcIiwgMjE5OiBcIltcIiwgMjIwOiBcIlxcXFxcIixcbiAgMjIxOiBcIl1cIiwgMjIyOiBcIidcIiwgNjMyMzI6IFwiVXBcIiwgNjMyMzM6IFwiRG93blwiLCA2MzIzNDogXCJMZWZ0XCIsIDYzMjM1OiBcIlJpZ2h0XCIsIDYzMjcyOiBcIkRlbGV0ZVwiLFxuICA2MzI3MzogXCJIb21lXCIsIDYzMjc1OiBcIkVuZFwiLCA2MzI3NjogXCJQYWdlVXBcIiwgNjMyNzc6IFwiUGFnZURvd25cIiwgNjMzMDI6IFwiSW5zZXJ0XCJcbn07XG5cbmV4cG9ydHMua2V5TmFtZXMgPSBrZXlOYW1lcztcbi8vIE51bWJlciBrZXlzXG5mb3IgKHZhciBpID0gMDsgaSA8IDEwOyBpKyspIHtcbiAga2V5TmFtZXNbaSArIDQ4XSA9IGtleU5hbWVzW2kgKyA5Nl0gPSBTdHJpbmcoaSk7XG59IC8vIEFscGhhYmV0aWMga2V5c1xuZm9yICh2YXIgaSA9IDY1OyBpIDw9IDkwOyBpKyspIHtcbiAga2V5TmFtZXNbaV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpO1xufSAvLyBGdW5jdGlvbiBrZXlzXG5mb3IgKHZhciBpID0gMTsgaSA8PSAxMjsgaSsrKSB7XG4gIGtleU5hbWVzW2kgKyAxMTFdID0ga2V5TmFtZXNbaSArIDYzMjM1XSA9IFwiRlwiICsgaTtcbn0gLy8gOjogKEtleWJvYXJkRXZlbnQpIOKGkiA/c3RyaW5nXG4vLyBGaW5kIGEgbmFtZSBmb3IgdGhlIGdpdmVuIGtleWRvd24gZXZlbnQuIElmIHRoZSBrZXljb2RlIGluIHRoZVxuLy8gZXZlbnQgaXMgbm90IGtub3duLCB0aGlzIHdpbGwgcmV0dXJuIGBudWxsYC4gT3RoZXJ3aXNlLCBpdCB3aWxsXG4vLyByZXR1cm4gYSBzdHJpbmcgbGlrZSBgXCJTaGlmdC1DbWQtQ3RybC1BbHQtSG9tZVwiYC4gVGhlIHBhcnRzIGJlZm9yZVxuLy8gdGhlIGRhc2hlcyBnaXZlIHRoZSBtb2RpZmllcnMgKGFsd2F5cyBpbiB0aGF0IG9yZGVyLCBpZiBwcmVzZW50KSxcbi8vIGFuZCB0aGUgbGFzdCB3b3JkIGdpdmVzIHRoZSBrZXkgbmFtZSwgd2hpY2ggb25lIG9mIHRoZSBuYW1lcyBpblxuLy8gYGtleU5hbWVzYC5cbi8vXG4vLyBUaGUgY29udmVudGlvbiBmb3Iga2V5cHJlc3MgZXZlbnRzIGlzIHRvIHVzZSB0aGUgcHJlc3NlZCBjaGFyYWN0ZXJcbi8vIGJldHdlZW4gc2luZ2xlIHF1b3Rlcy4gRHVlIHRvIGxpbWl0YXRpb25zIGluIHRoZSBicm93c2VyIEFQSSxcbi8vIGtleXByZXNzIGV2ZW50cyBjYW4gbm90IGhhdmUgbW9kaWZpZXJzLlxuXG5mdW5jdGlvbiBrZXlOYW1lKGV2ZW50KSB7XG4gIHZhciBiYXNlID0ga2V5TmFtZXNbZXZlbnQua2V5Q29kZV0sXG4gICAgICBuYW1lID0gYmFzZTtcbiAgaWYgKG5hbWUgPT0gbnVsbCB8fCBldmVudC5hbHRHcmFwaEtleSkgcmV0dXJuIG51bGw7XG5cbiAgaWYgKGV2ZW50LmFsdEtleSAmJiBiYXNlICE9IFwiQWx0XCIpIG5hbWUgPSBcIkFsdC1cIiArIG5hbWU7XG4gIGlmIChldmVudC5jdHJsS2V5ICYmIGJhc2UgIT0gXCJDdHJsXCIpIG5hbWUgPSBcIkN0cmwtXCIgKyBuYW1lO1xuICBpZiAoZXZlbnQubWV0YUtleSAmJiBiYXNlICE9IFwiQ21kXCIpIG5hbWUgPSBcIkNtZC1cIiArIG5hbWU7XG4gIGlmIChldmVudC5zaGlmdEtleSAmJiBiYXNlICE9IFwiU2hpZnRcIikgbmFtZSA9IFwiU2hpZnQtXCIgKyBuYW1lO1xuICByZXR1cm4gbmFtZTtcbn1cblxuLy8gOjogKHN0cmluZykg4oaSIGJvb2xcbi8vIFRlc3Qgd2hldGhlciB0aGUgZ2l2ZW4ga2V5IG5hbWUgcmVmZXJzIHRvIGEgbW9kaWZpZXIga2V5LlxuXG5mdW5jdGlvbiBpc01vZGlmaWVyS2V5KG5hbWUpIHtcbiAgbmFtZSA9IC9bXi1dKiQvLmV4ZWMobmFtZSlbMF07XG4gIHJldHVybiBuYW1lID09IFwiQ3RybFwiIHx8IG5hbWUgPT0gXCJBbHRcIiB8fCBuYW1lID09IFwiU2hpZnRcIiB8fCBuYW1lID09IFwiTW9kXCI7XG59XG5cbi8vIDo6IChzdHJpbmcpIOKGkiBzdHJpbmdcbi8vIE5vcm1hbGl6ZSBhIHNsb3BweSBrZXkgbmFtZSwgd2hpY2ggbWF5IGhhdmUgbW9kaWZpZXJzIGluIHRoZSB3cm9uZ1xuLy8gb3JkZXIgb3IgdXNlIHNob3J0aGFuZHMgZm9yIG1vZGlmaWVycywgdG8gYSBwcm9wZXJseSBmb3JtZWQga2V5XG4vLyBuYW1lLiBVc2VkIHRvIG5vcm1hbGl6ZSBuYW1lcyBwcm92aWRlZCBpbiBrZXltYXBzLlxuLy9cbi8vIE5vdGUgdGhhdCB0aGUgbW9kaWZpZXIgYG1vZGAgaXMgYSBzaG9ydGhhbmQgZm9yIGBDbWRgIG9uIE1hYywgYW5kXG4vLyBgQ3RybGAgb24gb3RoZXIgcGxhdGZvcm1zLlxuXG5mdW5jdGlvbiBub3JtYWxpemVLZXlOYW1lKG5hbWUpIHtcbiAgdmFyIHBhcnRzID0gbmFtZS5zcGxpdCgvLSg/ISc/JCkvKSxcbiAgICAgIHJlc3VsdCA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdO1xuICB2YXIgYWx0ID0gdW5kZWZpbmVkLFxuICAgICAgY3RybCA9IHVuZGVmaW5lZCxcbiAgICAgIHNoaWZ0ID0gdW5kZWZpbmVkLFxuICAgICAgY21kID0gdW5kZWZpbmVkO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIHZhciBtb2QgPSBwYXJ0c1tpXTtcbiAgICBpZiAoL14oY21kfG1ldGF8bSkkL2kudGVzdChtb2QpKSBjbWQgPSB0cnVlO2Vsc2UgaWYgKC9eYShsdCk/JC9pLnRlc3QobW9kKSkgYWx0ID0gdHJ1ZTtlbHNlIGlmICgvXihjfGN0cmx8Y29udHJvbCkkL2kudGVzdChtb2QpKSBjdHJsID0gdHJ1ZTtlbHNlIGlmICgvXnMoaGlmdCkkL2kudGVzdChtb2QpKSBzaGlmdCA9IHRydWU7ZWxzZSBpZiAoL15tb2QkL2kudGVzdChtb2QpKSB7XG4gICAgICBpZiAobWFjKSBjbWQgPSB0cnVlO2Vsc2UgY3RybCA9IHRydWU7XG4gICAgfSBlbHNlIHRocm93IG5ldyBFcnJvcihcIlVucmVjb2duaXplZCBtb2RpZmllciBuYW1lOiBcIiArIG1vZCk7XG4gIH1cbiAgaWYgKGFsdCkgcmVzdWx0ID0gXCJBbHQtXCIgKyByZXN1bHQ7XG4gIGlmIChjdHJsKSByZXN1bHQgPSBcIkN0cmwtXCIgKyByZXN1bHQ7XG4gIGlmIChjbWQpIHJlc3VsdCA9IFwiQ21kLVwiICsgcmVzdWx0O1xuICBpZiAoc2hpZnQpIHJlc3VsdCA9IFwiU2hpZnQtXCIgKyByZXN1bHQ7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8vIDs7IEEga2V5bWFwIGJpbmRzIGEgc2V0IG9mIFtrZXkgbmFtZXNdKCNrZXlOYW1lKSB0byBjb21tYW5kcyBuYW1lc1xuLy8gb3IgZnVuY3Rpb25zLlxuXG52YXIgS2V5bWFwID0gKGZ1bmN0aW9uICgpIHtcbiAgLy8gOjogKE9iamVjdCwgP09iamVjdClcbiAgLy8gQ29uc3RydWN0IGEga2V5bWFwIHVzaW5nIHRoZSBiaW5kaW5ncyBpbiBga2V5c2AsIHdob3NlIHByb3BlcnRpZXNcbiAgLy8gc2hvdWxkIGJlIFtrZXkgbmFtZXNdKCNrZXlOYW1lKSBvciBzcGFjZS1zZXBhcmF0ZWQgc2VxdWVuY2VzIG9mXG4gIC8vIGtleSBuYW1lcy4gSW4gdGhlIHNlY29uZCBjYXNlLCB0aGUgYmluZGluZyB3aWxsIGJlIGZvciBhXG4gIC8vIG11bHRpLXN0cm9rZSBrZXkgY29tYmluYXRpb24uXG4gIC8vXG4gIC8vIFdoZW4gYG9wdGlvbnNgIGhhcyBhIHByb3BlcnR5IGBjYWxsYCwgdGhpcyB3aWxsIGJlIGEgcHJvZ3JhbW1hdGljXG4gIC8vIGtleW1hcCwgbWVhbmluZyB0aGF0IGluc3RlYWQgb2YgbG9va2luZyBrZXlzIHVwIGluIGl0cyBzZXQgb2ZcbiAgLy8gYmluZGluZ3MsIGl0IHdpbGwgcGFzcyB0aGUga2V5IG5hbWUgdG8gYG9wdGlvbnMuY2FsbGAsIGFuZCB1c2VcbiAgLy8gdGhlIHJldHVybiB2YWx1ZSBvZiB0aGF0IGNhbGxzIGFzIHRoZSByZXNvbHZlZCBiaW5kaW5nLlxuICAvL1xuICAvLyBgb3B0aW9ucy5uYW1lYCBjYW4gYmUgdXNlZCB0byBnaXZlIHRoZSBrZXltYXAgYSBuYW1lLCBtYWtpbmcgaXRcbiAgLy8gZWFzaWVyIHRvIFtyZW1vdmVdKCNQcm9zZU1pcnJvci5yZW1vdmVLZXltYXApIGZyb20gYW4gZWRpdG9yLlxuXG4gIGZ1bmN0aW9uIEtleW1hcChrZXlzLCBvcHRpb25zKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEtleW1hcCk7XG5cbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHRoaXMuYmluZGluZ3MgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGlmIChrZXlzKSBmb3IgKHZhciBrZXluYW1lIGluIGtleXMpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoa2V5cywga2V5bmFtZSkpIHRoaXMuYWRkQmluZGluZyhrZXluYW1lLCBrZXlzW2tleW5hbWVdKTtcbiAgICB9XG4gIH1cblxuICAvLyA6OiAoc3RyaW5nLCBhbnkpXG4gIC8vIEFkZCBhIGJpbmRpbmcgZm9yIHRoZSBnaXZlbiBrZXkgb3Iga2V5IHNlcXVlbmNlLlxuXG4gIF9jcmVhdGVDbGFzcyhLZXltYXAsIFt7XG4gICAga2V5OiBcImFkZEJpbmRpbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkQmluZGluZyhrZXluYW1lLCB2YWx1ZSkge1xuICAgICAgdmFyIGtleXMgPSBrZXluYW1lLnNwbGl0KC8gKyg/IVxcJyQpLykubWFwKG5vcm1hbGl6ZUtleU5hbWUpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBfbmFtZSA9IGtleXMuc2xpY2UoMCwgaSArIDEpLmpvaW4oXCIgXCIpO1xuICAgICAgICB2YXIgdmFsID0gaSA9PSBrZXlzLmxlbmd0aCAtIDEgPyB2YWx1ZSA6IFwiLi4uXCI7XG4gICAgICAgIHZhciBwcmV2ID0gdGhpcy5iaW5kaW5nc1tfbmFtZV07XG4gICAgICAgIGlmICghcHJldikgdGhpcy5iaW5kaW5nc1tfbmFtZV0gPSB2YWw7ZWxzZSBpZiAocHJldiAhPSB2YWwpIHRocm93IG5ldyBFcnJvcihcIkluY29uc2lzdGVudCBiaW5kaW5ncyBmb3IgXCIgKyBfbmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gOjogKHN0cmluZylcbiAgICAvLyBSZW1vdmUgdGhlIGJpbmRpbmcgZm9yIHRoZSBnaXZlbiBrZXkgb3Iga2V5IHNlcXVlbmNlLlxuICB9LCB7XG4gICAga2V5OiBcInJlbW92ZUJpbmRpbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlQmluZGluZyhrZXluYW1lKSB7XG4gICAgICB2YXIga2V5cyA9IGtleW5hbWUuc3BsaXQoLyArKD8hXFwnJCkvKS5tYXAobm9ybWFsaXplS2V5TmFtZSk7XG4gICAgICBmb3IgKHZhciBpID0ga2V5cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB2YXIgX25hbWUyID0ga2V5cy5zbGljZSgwLCBpKS5qb2luKFwiIFwiKTtcbiAgICAgICAgdmFyIHZhbCA9IHRoaXMuYmluZGluZ3NbX25hbWUyXTtcbiAgICAgICAgaWYgKHZhbCA9PSBcIi4uLlwiICYmICF0aGlzLnVudXNlZE11bHRpKF9uYW1lMikpIGJyZWFrO2Vsc2UgaWYgKHZhbCkgZGVsZXRlIHRoaXMuYmluZGluZ3NbX25hbWUyXTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidW51c2VkTXVsdGlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW51c2VkTXVsdGkobmFtZSkge1xuICAgICAgZm9yICh2YXIgYmluZGluZyBpbiB0aGlzLmJpbmRpbmdzKSB7XG4gICAgICAgIGlmIChiaW5kaW5nLmxlbmd0aCA+IG5hbWUgJiYgYmluZGluZy5pbmRleE9mKG5hbWUpID09IDAgJiYgYmluZGluZy5jaGFyQXQobmFtZS5sZW5ndGgpID09IFwiIFwiKSByZXR1cm4gZmFsc2U7XG4gICAgICB9cmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gOjogKHN0cmluZywgP2FueSkg4oaSIGFueVxuICAgIC8vIExvb2tzIHVwIHRoZSBnaXZlbiBrZXkgb3Iga2V5IHNlcXVlbmNlIGluIHRoaXMga2V5bWFwLiBSZXR1cm5zXG4gICAgLy8gdGhlIHZhbHVlIHRoZSBrZXkgaXMgYm91bmQgdG8gKHdoaWNoIG1heSBiZSB1bmRlZmluZWQgaWYgaXQgaXNcbiAgICAvLyBub3QgYm91bmQpLCBvciB0aGUgc3RyaW5nIGBcIi4uLlwiYCBpZiB0aGUga2V5IGlzIGEgcHJlZml4IG9mIGFcbiAgICAvLyBtdWx0aS1rZXkgc2VxdWVuY2UgdGhhdCBpcyBib3VuZCBieSB0aGlzIGtleW1hcC5cbiAgfSwge1xuICAgIGtleTogXCJsb29rdXBcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbG9va3VwKGtleSwgY29udGV4dCkge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jYWxsID8gdGhpcy5vcHRpb25zLmNhbGwoa2V5LCBjb250ZXh0KSA6IHRoaXMuYmluZGluZ3Nba2V5XTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gS2V5bWFwO1xufSkoKTtcblxuZXhwb3J0cy5LZXltYXAgPSBLZXltYXA7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfZ2V0ID0gZnVuY3Rpb24gZ2V0KF94NCwgX3g1LCBfeDYpIHsgdmFyIF9hZ2FpbiA9IHRydWU7IF9mdW5jdGlvbjogd2hpbGUgKF9hZ2FpbikgeyB2YXIgb2JqZWN0ID0gX3g0LCBwcm9wZXJ0eSA9IF94NSwgcmVjZWl2ZXIgPSBfeDY7IF9hZ2FpbiA9IGZhbHNlOyBpZiAob2JqZWN0ID09PSBudWxsKSBvYmplY3QgPSBGdW5jdGlvbi5wcm90b3R5cGU7IHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTsgaWYgKGRlc2MgPT09IHVuZGVmaW5lZCkgeyB2YXIgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7IGlmIChwYXJlbnQgPT09IG51bGwpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSBlbHNlIHsgX3g0ID0gcGFyZW50OyBfeDUgPSBwcm9wZXJ0eTsgX3g2ID0gcmVjZWl2ZXI7IF9hZ2FpbiA9IHRydWU7IGRlc2MgPSBwYXJlbnQgPSB1bmRlZmluZWQ7IGNvbnRpbnVlIF9mdW5jdGlvbjsgfSB9IGVsc2UgaWYgKFwidmFsdWVcIiBpbiBkZXNjKSB7IHJldHVybiBkZXNjLnZhbHVlOyB9IGVsc2UgeyB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7IGlmIChnZXR0ZXIgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IHJldHVybiBnZXR0ZXIuY2FsbChyZWNlaXZlcik7IH0gfSB9O1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxucmVxdWlyZShcIi4vY3NzXCIpO1xuXG52YXIgX21vZGVsID0gcmVxdWlyZShcIi4uL21vZGVsXCIpO1xuXG52YXIgX3RyYW5zZm9ybSA9IHJlcXVpcmUoXCIuLi90cmFuc2Zvcm1cIik7XG5cbnZhciBfdXRpbFNvcnRlZGluc2VydCA9IHJlcXVpcmUoXCIuLi91dGlsL3NvcnRlZGluc2VydFwiKTtcblxudmFyIF91dGlsU29ydGVkaW5zZXJ0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3V0aWxTb3J0ZWRpbnNlcnQpO1xuXG52YXIgX3V0aWxNYXAgPSByZXF1aXJlKFwiLi4vdXRpbC9tYXBcIik7XG5cbnZhciBfdXRpbEV2ZW50ID0gcmVxdWlyZShcIi4uL3V0aWwvZXZlbnRcIik7XG5cbnZhciBfZG9tID0gcmVxdWlyZShcIi4uL2RvbVwiKTtcblxudmFyIF9zZXJpYWxpemVUZXh0ID0gcmVxdWlyZShcIi4uL3NlcmlhbGl6ZS90ZXh0XCIpO1xuXG5yZXF1aXJlKFwiLi4vcGFyc2UvdGV4dFwiKTtcblxudmFyIF9wYXJzZSA9IHJlcXVpcmUoXCIuLi9wYXJzZVwiKTtcblxudmFyIF9zZXJpYWxpemUgPSByZXF1aXJlKFwiLi4vc2VyaWFsaXplXCIpO1xuXG52YXIgX29wdGlvbnMgPSByZXF1aXJlKFwiLi9vcHRpb25zXCIpO1xuXG52YXIgX3NlbGVjdGlvbjIgPSByZXF1aXJlKFwiLi9zZWxlY3Rpb25cIik7XG5cbnZhciBfZHJhdyA9IHJlcXVpcmUoXCIuL2RyYXdcIik7XG5cbnZhciBfaW5wdXQgPSByZXF1aXJlKFwiLi9pbnB1dFwiKTtcblxudmFyIF9oaXN0b3J5ID0gcmVxdWlyZShcIi4vaGlzdG9yeVwiKTtcblxudmFyIF9jb21tYW5kcyA9IHJlcXVpcmUoXCIuL2NvbW1hbmRzXCIpO1xuXG52YXIgX3JhbmdlID0gcmVxdWlyZShcIi4vcmFuZ2VcIik7XG5cbnZhciBfa2V5cyA9IHJlcXVpcmUoXCIuL2tleXNcIik7XG5cbi8vIDs7IFRoaXMgaXMgdGhlIGNsYXNzIHVzZWQgdG8gcmVwcmVzZW50IGluc3RhbmNlcyBvZiB0aGUgZWRpdG9yLiBBXG4vLyBQcm9zZU1pcnJvciBlZGl0b3IgaG9sZHMgYSBbZG9jdW1lbnRdKCNOb2RlKSBhbmQgYVxuLy8gW3NlbGVjdGlvbl0oI1NlbGVjdGlvbiksIGFuZCBkaXNwbGF5cyBhbiBlZGl0YWJsZSBzdXJmYWNlXG4vLyByZXByZXNlbnRpbmcgdGhhdCBkb2N1bWVudCBpbiB0aGUgYnJvd3NlciBkb2N1bWVudC5cbi8vXG4vLyBDb250YWlucyBldmVudCBtZXRob2RzIChgb25gLCBldGMpIGZyb20gdGhlIFtldmVudFxuLy8gbWl4aW5dKCNFdmVudE1peGluKS5cblxudmFyIFByb3NlTWlycm9yID0gKGZ1bmN0aW9uICgpIHtcbiAgLy8gOjogKE9iamVjdClcbiAgLy8gQ29uc3RydWN0IGEgbmV3IGVkaXRvciBmcm9tIGEgc2V0IG9mIFtvcHRpb25zXSgjZWRpdF9vcHRpb25zKVxuICAvLyBhbmQsIGlmIGl0IGhhcyBhIFtgcGxhY2VgXSgjcGxhY2UpIG9wdGlvbiwgYWRkIGl0IHRvIHRoZVxuICAvLyBkb2N1bWVudC5cblxuICBmdW5jdGlvbiBQcm9zZU1pcnJvcihvcHRzKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFByb3NlTWlycm9yKTtcblxuICAgIG9wdHMgPSB0aGlzLm9wdGlvbnMgPSAoMCwgX29wdGlvbnMucGFyc2VPcHRpb25zKShvcHRzKTtcbiAgICAvLyA6OiBTY2hlbWFcbiAgICAvLyBUaGUgc2NoZW1hIGZvciB0aGlzIGVkaXRvcidzIGRvY3VtZW50LlxuICAgIHRoaXMuc2NoZW1hID0gb3B0cy5zY2hlbWE7XG4gICAgaWYgKG9wdHMuZG9jID09IG51bGwpIG9wdHMuZG9jID0gdGhpcy5zY2hlbWEubm9kZShcImRvY1wiLCBudWxsLCBbdGhpcy5zY2hlbWEubm9kZShcInBhcmFncmFwaFwiKV0pO1xuICAgIC8vIDo6IERPTU5vZGVcbiAgICAvLyBUaGUgZWRpdGFibGUgRE9NIG5vZGUgY29udGFpbmluZyB0aGUgZG9jdW1lbnQuXG4gICAgdGhpcy5jb250ZW50ID0gKDAsIF9kb20uZWx0KShcImRpdlwiLCB7IFwiY2xhc3NcIjogXCJQcm9zZU1pcnJvci1jb250ZW50XCIgfSk7XG4gICAgLy8gOjogRE9NTm9kZVxuICAgIC8vIFRoZSBvdXRlciBET00gZWxlbWVudCBvZiB0aGUgZWRpdG9yLlxuICAgIHRoaXMud3JhcHBlciA9ICgwLCBfZG9tLmVsdCkoXCJkaXZcIiwgeyBcImNsYXNzXCI6IFwiUHJvc2VNaXJyb3JcIiB9LCB0aGlzLmNvbnRlbnQpO1xuICAgIHRoaXMud3JhcHBlci5Qcm9zZU1pcnJvciA9IHRoaXM7XG5cbiAgICBpZiAob3B0cy5wbGFjZSAmJiBvcHRzLnBsYWNlLmFwcGVuZENoaWxkKSBvcHRzLnBsYWNlLmFwcGVuZENoaWxkKHRoaXMud3JhcHBlcik7ZWxzZSBpZiAob3B0cy5wbGFjZSkgb3B0cy5wbGFjZSh0aGlzLndyYXBwZXIpO1xuXG4gICAgdGhpcy5zZXREb2NJbm5lcihvcHRzLmRvY0Zvcm1hdCA/ICgwLCBfcGFyc2UucGFyc2VGcm9tKSh0aGlzLnNjaGVtYSwgb3B0cy5kb2MsIG9wdHMuZG9jRm9ybWF0KSA6IG9wdHMuZG9jKTtcbiAgICAoMCwgX2RyYXcuZHJhdykodGhpcywgdGhpcy5kb2MpO1xuICAgIHRoaXMuY29udGVudC5jb250ZW50RWRpdGFibGUgPSB0cnVlO1xuICAgIGlmIChvcHRzLmxhYmVsKSB0aGlzLmNvbnRlbnQuc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBvcHRzLmxhYmVsKTtcblxuICAgIC8vIDo6IE9iamVjdFxuICAgIC8vIEEgbmFtZXNwYWNlIHdoZXJlIG1vZHVsZXMgY2FuIHN0b3JlIHJlZmVyZW5jZXMgdG8gdGhlbXNlbHZlc1xuICAgIC8vIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVkaXRvciBpbnN0YW5jZS5cbiAgICB0aGlzLm1vZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy5vcGVyYXRpb24gPSBudWxsO1xuICAgIHRoaXMuZGlydHlOb2RlcyA9IG5ldyBfdXRpbE1hcC5NYXAoKTsgLy8gTWFwcyBub2RlIG9iamVjdCB0byAxIChyZS1zY2FuIGNvbnRlbnQpIG9yIDIgKHJlZHJhdyBlbnRpcmVseSlcbiAgICB0aGlzLmZsdXNoU2NoZWR1bGVkID0gZmFsc2U7XG5cbiAgICB0aGlzLnNlbCA9IG5ldyBfc2VsZWN0aW9uMi5TZWxlY3Rpb25TdGF0ZSh0aGlzKTtcbiAgICB0aGlzLmFjY3VyYXRlU2VsZWN0aW9uID0gZmFsc2U7XG4gICAgdGhpcy5pbnB1dCA9IG5ldyBfaW5wdXQuSW5wdXQodGhpcyk7XG5cbiAgICAvLyA6OiBPYmplY3Q8Q29tbWFuZD5cbiAgICAvLyBUaGUgY29tbWFuZHMgYXZhaWxhYmxlIGluIHRoZSBlZGl0b3IuXG4gICAgdGhpcy5jb21tYW5kcyA9ICgwLCBfY29tbWFuZHMuaW5pdENvbW1hbmRzKSh0aGlzKTtcbiAgICB0aGlzLmNvbW1hbmRLZXlzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgICgwLCBfb3B0aW9ucy5pbml0T3B0aW9ucykodGhpcyk7XG4gIH1cblxuICAvLyA6OiAoc3RyaW5nLCBhbnkpXG4gIC8vIFVwZGF0ZSB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIFtvcHRpb25dKCNlZGl0X29wdGlvbnMpLlxuXG4gIF9jcmVhdGVDbGFzcyhQcm9zZU1pcnJvciwgW3tcbiAgICBrZXk6IFwic2V0T3B0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldE9wdGlvbihuYW1lLCB2YWx1ZSkge1xuICAgICAgKDAsIF9vcHRpb25zLnNldE9wdGlvbikodGhpcywgbmFtZSwgdmFsdWUpO1xuICAgIH1cblxuICAgIC8vIDo6IChzdHJpbmcpIOKGkiBhbnlcbiAgICAvLyBHZXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGdpdmVuIFtvcHRpb25dKCNlZGl0X29wdGlvbnMpLlxuICB9LCB7XG4gICAga2V5OiBcImdldE9wdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRPcHRpb24obmFtZSkge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9uc1tuYW1lXTtcbiAgICB9XG5cbiAgICAvLyA6OiBTZWxlY3Rpb25cbiAgICAvLyBHZXQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLlxuICB9LCB7XG4gICAga2V5OiBcInNldFRleHRTZWxlY3Rpb25cIixcblxuICAgIC8vIDo6IChQb3MsID9Qb3MpXG4gICAgLy8gU2V0IHRoZSBzZWxlY3Rpb24gdG8gYSBbdGV4dCBzZWxlY3Rpb25dKCNUZXh0U2VsZWN0aW9uKSBmcm9tXG4gICAgLy8gYGFuY2hvcmAgdG8gYGhlYWRgLCBvciwgaWYgYGhlYWRgIGlzIG51bGwsIGEgY3Vyc29yIHNlbGVjdGlvbiBhdFxuICAgIC8vIGBhbmNob3JgLlxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRUZXh0U2VsZWN0aW9uKGFuY2hvciwgaGVhZCkge1xuICAgICAgdGhpcy5zZXRTZWxlY3Rpb24obmV3IF9zZWxlY3Rpb24yLlRleHRTZWxlY3Rpb24oYW5jaG9yLCBoZWFkKSk7XG4gICAgfVxuXG4gICAgLy8gOjogKFBvcylcbiAgICAvLyBTZXQgdGhlIHNlbGVjdGlvbiB0byBhIG5vZGUgc2VsZWN0aW9uIG9uIHRoZSBub2RlIGFmdGVyIGBwb3NgLlxuICB9LCB7XG4gICAga2V5OiBcInNldE5vZGVTZWxlY3Rpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0Tm9kZVNlbGVjdGlvbihwb3MpIHtcbiAgICAgIHRoaXMuY2hlY2tQb3MocG9zLCBmYWxzZSk7XG4gICAgICB2YXIgcGFyZW50ID0gdGhpcy5kb2MucGF0aChwb3MucGF0aCk7XG4gICAgICBpZiAocG9zLm9mZnNldCA+PSBwYXJlbnQuc2l6ZSkgdGhyb3cgbmV3IEVycm9yKFwiVHJ5aW5nIHRvIHNldCBhIG5vZGUgc2VsZWN0aW9uIGF0IHRoZSBlbmQgb2YgYSBub2RlXCIpO1xuICAgICAgdmFyIG5vZGUgPSBwYXJlbnQuY2hpbGQocG9zLm9mZnNldCk7XG4gICAgICBpZiAoIW5vZGUudHlwZS5zZWxlY3RhYmxlKSB0aHJvdyBuZXcgRXJyb3IoXCJUcnlpbmcgdG8gc2VsZWN0IGEgbm9uLXNlbGVjdGFibGUgbm9kZVwiKTtcbiAgICAgIHRoaXMuaW5wdXQubWF5YmVBYm9ydENvbXBvc2l0aW9uKCk7XG4gICAgICB0aGlzLnNlbC5zZXRBbmRTaWduYWwobmV3IF9zZWxlY3Rpb24yLk5vZGVTZWxlY3Rpb24ocG9zLCBwb3MubW92ZSgxKSwgbm9kZSkpO1xuICAgIH1cblxuICAgIC8vIDo6IChTZWxlY3Rpb24pXG4gICAgLy8gU2V0IHRoZSBzZWxlY3Rpb24gdG8gdGhlIGdpdmVuIHNlbGVjdGlvbiBvYmplY3QuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0U2VsZWN0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFNlbGVjdGlvbihzZWxlY3Rpb24pIHtcbiAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBfc2VsZWN0aW9uMi5UZXh0U2VsZWN0aW9uKSB7XG4gICAgICAgIHRoaXMuY2hlY2tQb3Moc2VsZWN0aW9uLmhlYWQsIHRydWUpO1xuICAgICAgICBpZiAoIXNlbGVjdGlvbi5lbXB0eSkgdGhpcy5jaGVja1BvcyhzZWxlY3Rpb24uYW5jaG9yLCB0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2hlY2tQb3Moc2VsZWN0aW9uLnRvLCBmYWxzZSk7XG4gICAgICB9XG4gICAgICB0aGlzLnNldFNlbGVjdGlvbkRpcmVjdChzZWxlY3Rpb24pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRTZWxlY3Rpb25EaXJlY3RcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0U2VsZWN0aW9uRGlyZWN0KHNlbGVjdGlvbikge1xuICAgICAgdGhpcy5lbnN1cmVPcGVyYXRpb24oKTtcbiAgICAgIHRoaXMuaW5wdXQubWF5YmVBYm9ydENvbXBvc2l0aW9uKCk7XG4gICAgICBpZiAoIXNlbGVjdGlvbi5lcSh0aGlzLnNlbC5yYW5nZSkpIHRoaXMuc2VsLnNldEFuZFNpZ25hbChzZWxlY3Rpb24pO1xuICAgIH1cblxuICAgIC8vIDo6IChhbnksID9zdHJpbmcpXG4gICAgLy8gUmVwbGFjZSB0aGUgZWRpdG9yJ3MgZG9jdW1lbnQuIFdoZW4gYGZvcm1hdGAgaXMgZ2l2ZW4sIGl0IHNob3VsZFxuICAgIC8vIGJlIGEgW3BhcnNhYmxlIGZvcm1hdF0oI3BhcnNlKSwgYW5kIGB2YWx1ZWAgc2hvdWxkIHNvbWV0aGluZyBpblxuICAgIC8vIHRoYXQgZm9ybWF0LiBJZiBub3QsIGB2YWx1ZWAgc2hvdWxkIGJlIGEgYE5vZGVgLlxuICB9LCB7XG4gICAga2V5OiBcInNldENvbnRlbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0Q29udGVudCh2YWx1ZSwgZm9ybWF0KSB7XG4gICAgICBpZiAoZm9ybWF0KSB2YWx1ZSA9ICgwLCBfcGFyc2UucGFyc2VGcm9tKSh0aGlzLnNjaGVtYSwgdmFsdWUsIGZvcm1hdCk7XG4gICAgICB0aGlzLnNldERvYyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gOjogKD9zdHJpbmcpIOKGkiBhbnlcbiAgICAvLyBHZXQgdGhlIGVkaXRvcidzIGNvbnRlbnQgaW4gYSBnaXZlbiBmb3JtYXQuIFdoZW4gYGZvcm1hdGAgaXMgbm90XG4gICAgLy8gZ2l2ZW4sIGEgYE5vZGVgIGlzIHJldHVybmVkLiBJZiBpdCBpcyBnaXZlbiwgaXQgc2hvdWxkIGJlIGFuXG4gICAgLy8gZXhpc3RpbmcgW3NlcmlhbGl6YXRpb24gZm9ybWF0XSgjc2VyaWFsaXplKS5cbiAgfSwge1xuICAgIGtleTogXCJnZXRDb250ZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldENvbnRlbnQoZm9ybWF0KSB7XG4gICAgICByZXR1cm4gZm9ybWF0ID8gKDAsIF9zZXJpYWxpemUuc2VyaWFsaXplVG8pKHRoaXMuZG9jLCBmb3JtYXQpIDogdGhpcy5kb2M7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldERvY0lubmVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldERvY0lubmVyKGRvYykge1xuICAgICAgaWYgKGRvYy50eXBlICE9IHRoaXMuc2NoZW1hLm5vZGVzLmRvYykgdGhyb3cgbmV3IEVycm9yKFwiVHJ5aW5nIHRvIHNldCBhIGRvY3VtZW50IHdpdGggYSBkaWZmZXJlbnQgc2NoZW1hXCIpO1xuICAgICAgLy8gOjogTm9kZSBUaGUgY3VycmVudCBkb2N1bWVudC5cbiAgICAgIHRoaXMuZG9jID0gZG9jO1xuICAgICAgdGhpcy5yYW5nZXMgPSBuZXcgX3JhbmdlLlJhbmdlU3RvcmUodGhpcyk7XG4gICAgICB0aGlzLmhpc3RvcnkgPSBuZXcgX2hpc3RvcnkuSGlzdG9yeSh0aGlzKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoTm9kZSwgP1NlbGVjdGlvbilcbiAgICAvLyBTZXQgdGhlIGVkaXRvcidzIGNvbnRlbnQsIGFuZCBvcHRpb25hbGx5IGluY2x1ZGUgYSBuZXcgc2VsZWN0aW9uLlxuICB9LCB7XG4gICAga2V5OiBcInNldERvY1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXREb2MoZG9jLCBzZWwpIHtcbiAgICAgIGlmICghc2VsKSBzZWwgPSAoMCwgX3NlbGVjdGlvbjIuZmluZFNlbGVjdGlvbkF0U3RhcnQpKGRvYyk7XG4gICAgICAvLyA6OiAoZG9jOiBOb2RlLCBzZWxlY3Rpb246IFNlbGVjdGlvbikgI3BhdGg9UHJvc2VNaXJyb3IjZXZlbnRzI2JlZm9yZVNldERvY1xuICAgICAgLy8gRmlyZWQgd2hlbiBbYHNldERvY2BdKCNQcm9zZU1pcnJvci5zZXREb2MpIGlzIGNhbGxlZCwgYmVmb3JlXG4gICAgICAvLyB0aGUgZG9jdW1lbnQgaXMgYWN0dWFsbHkgdXBkYXRlZC5cbiAgICAgIHRoaXMuc2lnbmFsKFwiYmVmb3JlU2V0RG9jXCIsIGRvYywgc2VsKTtcbiAgICAgIHRoaXMuZW5zdXJlT3BlcmF0aW9uKCk7XG4gICAgICB0aGlzLnNldERvY0lubmVyKGRvYyk7XG4gICAgICB0aGlzLnNlbC5zZXQoc2VsLCB0cnVlKTtcbiAgICAgIC8vIDo6IChkb2M6IE5vZGUsIHNlbGVjdGlvbjogU2VsZWN0aW9uKSAjcGF0aD1Qcm9zZU1pcnJvciNldmVudHMjc2V0RG9jXG4gICAgICAvLyBGaXJlZCB3aGVuIFtgc2V0RG9jYF0oI1Byb3NlTWlycm9yLnNldERvYykgaXMgY2FsbGVkLCBhZnRlclxuICAgICAgLy8gdGhlIGRvY3VtZW50IGlzIHVwZGF0ZWQuXG4gICAgICB0aGlzLnNpZ25hbChcInNldERvY1wiLCBkb2MsIHNlbCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInVwZGF0ZURvY1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGVEb2MoZG9jLCBtYXBwaW5nLCBzZWxlY3Rpb24pIHtcbiAgICAgIHRoaXMuZW5zdXJlT3BlcmF0aW9uKCk7XG4gICAgICB0aGlzLmlucHV0Lm1heWJlQWJvcnRDb21wb3NpdGlvbigpO1xuICAgICAgdGhpcy5yYW5nZXMudHJhbnNmb3JtKG1hcHBpbmcpO1xuICAgICAgdGhpcy5kb2MgPSBkb2M7XG4gICAgICB0aGlzLnNlbC5zZXRBbmRTaWduYWwoc2VsZWN0aW9uIHx8IHRoaXMuc2VsLnJhbmdlLm1hcChkb2MsIG1hcHBpbmcpKTtcbiAgICAgIC8vIDo6ICgpICNwYXRoPVByb3NlTWlycm9yI2V2ZW50cyNjaGFuZ2VcbiAgICAgIC8vIEZpcmVkIHdoZW4gdGhlIGRvY3VtZW50IGhhcyBjaGFuZ2VkLiBTZWVcbiAgICAgIC8vIFtgc2V0RG9jYF0oI1Byb3NlTWlycm9yLmV2ZW50X3NldERvYykgYW5kXG4gICAgICAvLyBbYHRyYW5zZm9ybWBdKCNQcm9zZU1pcnJvci5ldmVudF90cmFuc2Zvcm0pIGZvciBtb3JlIHNwZWNpZmljXG4gICAgICAvLyBjaGFuZ2UtcmVsYXRlZCBldmVudHMuXG4gICAgICB0aGlzLnNpZ25hbChcImNoYW5nZVwiKTtcbiAgICB9XG5cbiAgICAvLyA6OiBFZGl0b3JUcmFuc2Zvcm1cbiAgICAvLyBDcmVhdGUgYW4gZWRpdG9yLSBhbmQgc2VsZWN0aW9uLWF3YXJlIGBUcmFuc2Zvcm1gIGZvciB0aGlzIGVkaXRvci5cbiAgfSwge1xuICAgIGtleTogXCJhcHBseVwiLFxuXG4gICAgLy8gOjogKFRyYW5zZm9ybSwgP09iamVjdCkg4oaSID9UcmFuc2Zvcm1cbiAgICAvLyBBcHBseSBhIHRyYW5zZm9ybWF0aW9uICh3aGljaCB5b3UgbWlnaHQgd2FudCB0byBjcmVhdGUgd2l0aCB0aGVcbiAgICAvLyBbYHRyYCBnZXR0ZXJdKCNQcm9zZU1pcnJvci50cikpIHRvIHRoZSBkb2N1bWVudCBpbiB0aGUgZWRpdG9yLlxuICAgIC8vIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgc3VwcG9ydGVkOlxuICAgIC8vXG4gICAgLy8gKipgc2VsZWN0aW9uYCoqYDogP1NlbGVjdGlvbmBcbiAgICAvLyAgIDogQSBuZXcgc2VsZWN0aW9uIHRvIHNldCBhZnRlciB0aGUgdHJhbnNmb3JtYXRpb24gaXMgYXBwbGllZC5cbiAgICAvL1xuICAgIC8vICoqYHNjcm9sbEludG9WaWV3YCoqOiA/Ym9vbFxuICAgIC8vICAgOiBXaGVuIHRydWUsIHNjcm9sbCB0aGUgc2VsZWN0aW9uIGludG8gdmlldyBvbiB0aGUgbmV4dFxuICAgIC8vICAgICBbcmVkcmF3XSgjUHJvc2VNaXJyb3IuZmx1c2gpLlxuICAgIC8vXG4gICAgLy8gUmV0dXJucyB0aGUgdHJhbnNmb3JtLCBvciBgZmFsc2VgIGlmIHRoZXJlIHdlcmUgbm8gc3RlcHMgaW4gaXQuXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFwcGx5KHRyYW5zZm9ybSkge1xuICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyBudWxsT3B0aW9ucyA6IGFyZ3VtZW50c1sxXTtcblxuICAgICAgaWYgKHRyYW5zZm9ybS5kb2MgPT0gdGhpcy5kb2MpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICh0cmFuc2Zvcm0uZG9jc1swXSAhPSB0aGlzLmRvYyAmJiAoMCwgX21vZGVsLmZpbmREaWZmU3RhcnQpKHRyYW5zZm9ybS5kb2NzWzBdLCB0aGlzLmRvYykpIHRocm93IG5ldyBFcnJvcihcIkFwcGx5aW5nIGEgdHJhbnNmb3JtIHRoYXQgZG9lcyBub3Qgc3RhcnQgd2l0aCB0aGUgY3VycmVudCBkb2N1bWVudFwiKTtcblxuICAgICAgdGhpcy51cGRhdGVEb2ModHJhbnNmb3JtLmRvYywgdHJhbnNmb3JtLCBvcHRpb25zLnNlbGVjdGlvbik7XG4gICAgICAvLyA6OiAoVHJhbnNmb3JtLCBPYmplY3QpICNwYXRoPVByb3NlTWlycm9yI2V2ZW50cyN0cmFuc2Zvcm1cbiAgICAgIC8vIFNpZ25hbHMgdGhhdCBhIChub24tZW1wdHkpIHRyYW5zZm9ybWF0aW9uIGhhcyBiZWVuIGFwbGllZCB0b1xuICAgICAgLy8gdGhlIGVkaXRvci4gUGFzc2VzIHRoZSBgVHJhbnNmb3JtYCBhbmQgdGhlIG9wdGlvbnMgZ2l2ZW4gdG9cbiAgICAgIC8vIFtgYXBwbHlgXSgjUHJvc2VNaXJyb3IuYXBwbHkpIGFzIGFyZ3VtZW50cyB0byB0aGUgaGFuZGxlci5cbiAgICAgIHRoaXMuc2lnbmFsKFwidHJhbnNmb3JtXCIsIHRyYW5zZm9ybSwgb3B0aW9ucyk7XG4gICAgICBpZiAob3B0aW9ucy5zY3JvbGxJbnRvVmlldykgdGhpcy5zY3JvbGxJbnRvVmlldygpO1xuICAgICAgcmV0dXJuIHRyYW5zZm9ybTtcbiAgICB9XG5cbiAgICAvLyA6OiAoUG9zLCA/Ym9vbClcbiAgICAvLyBWZXJpZnkgdGhhdCB0aGUgZ2l2ZW4gcG9zaXRpb24gaXMgdmFsaWQgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQsXG4gICAgLy8gYW5kIHRocm93IGFuIGVycm9yIG90aGVyd2lzZS4gV2hlbiBgdGV4dGJsb2NrYCBpcyB0cnVlLCB0aGUgcG9zaXRpb25cbiAgICAvLyBtdXN0IGFsc28gZmFsbCB3aXRoaW4gYSB0ZXh0YmxvY2sgbm9kZS5cbiAgfSwge1xuICAgIGtleTogXCJjaGVja1Bvc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjaGVja1Bvcyhwb3MsIHRleHRibG9jaykge1xuICAgICAgaWYgKCF0aGlzLmRvYy5pc1ZhbGlkUG9zKHBvcywgdGV4dGJsb2NrKSkgdGhyb3cgbmV3IEVycm9yKFwiUG9zaXRpb24gXCIgKyBwb3MgKyBcIiBpcyBub3QgdmFsaWQgaW4gY3VycmVudCBkb2N1bWVudFwiKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZW5zdXJlT3BlcmF0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVuc3VyZU9wZXJhdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLm9wZXJhdGlvbiB8fCB0aGlzLnN0YXJ0T3BlcmF0aW9uKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInN0YXJ0T3BlcmF0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN0YXJ0T3BlcmF0aW9uKCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdGhpcy5zZWwuYmVmb3JlU3RhcnRPcCgpO1xuICAgICAgdGhpcy5vcGVyYXRpb24gPSBuZXcgT3BlcmF0aW9uKHRoaXMpO1xuICAgICAgaWYgKCF0aGlzLmZsdXNoU2NoZWR1bGVkKSB7XG4gICAgICAgICgwLCBfZG9tLnJlcXVlc3RBbmltYXRpb25GcmFtZSkoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF90aGlzLmZsdXNoU2NoZWR1bGVkID0gZmFsc2U7XG4gICAgICAgICAgX3RoaXMuZmx1c2goKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZmx1c2hTY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMub3BlcmF0aW9uO1xuICAgIH1cblxuICAgIC8vIDo6ICgpXG4gICAgLy8gRmx1c2ggYW55IHBlbmRpbmcgY2hhbmdlcyB0byB0aGUgRE9NLiBXaGVuIHRoZSBkb2N1bWVudCxcbiAgICAvLyBzZWxlY3Rpb24sIG9yIG1hcmtlZCByYW5nZXMgaW4gYW4gZWRpdG9yIGNoYW5nZSwgdGhlIERPTSBpc24ndFxuICAgIC8vIHVwZGF0ZWQgaW1tZWRpYXRlbHksIGJ1dCByYXRoZXIgc2NoZWR1bGVkIHRvIGJlIHVwZGF0ZWQgdGhlIG5leHRcbiAgICAvLyB0aW1lIHRoZSBicm93c2VyIHJlZHJhd3MgdGhlIHNjcmVlbi4gVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG9cbiAgICAvLyBmb3JjZSB0aGlzIHRvIGhhcHBlbiBpbW1lZGlhdGVseS4gSXQgY2FuIGJlIHVzZWZ1bCB3aGVuIHlvdSwgZm9yXG4gICAgLy8gZXhhbXBsZSwgd2FudCB0byBtZWFzdXJlIHdoZXJlIG9uIHRoZSBzY3JlZW4gYSBwYXJ0IG9mIHRoZVxuICAgIC8vIGRvY3VtZW50IGVuZHMgdXAsIGltbWVkaWF0ZWx5IGFmdGVyIGNoYW5naW5nIHRoZSBkb2N1bWVudC5cbiAgfSwge1xuICAgIGtleTogXCJmbHVzaFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmbHVzaCgpIHtcbiAgICAgIGlmICghZG9jdW1lbnQuYm9keS5jb250YWlucyh0aGlzLndyYXBwZXIpIHx8ICF0aGlzLm9wZXJhdGlvbikgcmV0dXJuO1xuICAgICAgLy8gOjogKCkgI3BhdGg9UHJvc2VNaXJyb3IjZXZlbnRzI2ZsdXNoaW5nXG4gICAgICAvLyBGaXJlZCB3aGVuIHRoZSBlZGl0b3IgaXMgYWJvdXQgdG8gW2ZsdXNoXSgjUHJvc2VNaXJyb3IuZmx1c2gpXG4gICAgICAvLyBhbiB1cGRhdGUgdG8gdGhlIERPTS5cbiAgICAgIHRoaXMuc2lnbmFsKFwiZmx1c2hpbmdcIik7XG4gICAgICB2YXIgb3AgPSB0aGlzLm9wZXJhdGlvbjtcbiAgICAgIGlmICghb3ApIHJldHVybjtcbiAgICAgIHRoaXMub3BlcmF0aW9uID0gbnVsbDtcbiAgICAgIHRoaXMuYWNjdXJhdGVTZWxlY3Rpb24gPSB0cnVlO1xuXG4gICAgICB2YXIgZG9jQ2hhbmdlZCA9IG9wLmRvYyAhPSB0aGlzLmRvYyB8fCB0aGlzLmRpcnR5Tm9kZXMuc2l6ZSxcbiAgICAgICAgICByZWRyYXduID0gZmFsc2U7XG4gICAgICBpZiAoIXRoaXMuaW5wdXQuY29tcG9zaW5nICYmIChkb2NDaGFuZ2VkIHx8IG9wLmNvbXBvc2luZ0F0U3RhcnQpKSB7XG4gICAgICAgICgwLCBfZHJhdy5yZWRyYXcpKHRoaXMsIHRoaXMuZGlydHlOb2RlcywgdGhpcy5kb2MsIG9wLmRvYyk7XG4gICAgICAgIHRoaXMuZGlydHlOb2Rlcy5jbGVhcigpO1xuICAgICAgICByZWRyYXduID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKChyZWRyYXduIHx8ICFvcC5zZWwuZXEodGhpcy5zZWwucmFuZ2UpKSAmJiAhdGhpcy5pbnB1dC5jb21wb3NpbmcpIHRoaXMuc2VsLnRvRE9NKG9wLmZvY3VzKTtcblxuICAgICAgaWYgKG9wLnNjcm9sbEludG9WaWV3ICE9PSBmYWxzZSkgKDAsIF9zZWxlY3Rpb24yLnNjcm9sbEludG9WaWV3KSh0aGlzLCBvcC5zY3JvbGxJbnRvVmlldyk7XG4gICAgICAvLyA6OiAoKSAjcGF0aD1Qcm9zZU1pcnJvciNldmVudHMjZHJhd1xuICAgICAgLy8gRmlyZWQgd2hlbiB0aGUgZWRpdG9yIHJlZHJldyBpdHMgZG9jdW1lbnQgaW4gdGhlIERPTS5cbiAgICAgIGlmIChkb2NDaGFuZ2VkKSB0aGlzLnNpZ25hbChcImRyYXdcIik7XG4gICAgICAvLyA6OiAoKSAjcGF0aD1Qcm9zZU1pcnJvciNldmVudHMjZmx1c2hcbiAgICAgIC8vIEZpcmVkIHdoZW4gdGhlIGVkaXRvciBoYXMgZmluaXNoZWRcbiAgICAgIC8vIFtmbHVzaGluZ10oI1Byb3NlTWlycm9yLmZsdXNoKSBhbiB1cGRhdGUgdG8gdGhlIERPTS4gSWYgeW91XG4gICAgICAvLyBuZWVkIHRvIHJlc3BvbmQgdG8gdGhpcyB3aXRoIGEgRE9NIHVwZGF0ZSBvZiB5b3VyIG93biwgdXNlIHRoaXNcbiAgICAgIC8vIGV2ZW50IHRvIHJlYWQgbGF5b3V0IGZyb20gdGhlIERPTSwgYW5kXG4gICAgICAvLyBbYGZsdXNoZWRgXSgjUHJvc2VNaXJyb3IuZXZlbnRfZmx1c2hlZCkgdG8gdXBkYXRlIHRoZSBET00uXG4gICAgICB0aGlzLnNpZ25hbChcImZsdXNoXCIpO1xuICAgICAgLy8gOjogKCkgI3BhdGg9UHJvc2VNaXJyb3IjZXZlbnRzI2ZsdXNoZWRcbiAgICAgIC8vIEZpcmVkIHdoZW4gdGhlIGVkaXRvciBoYXMgZmluaXNoZWRcbiAgICAgIC8vIFtmbHVzaGluZ10oI1Byb3NlTWlycm9yLmZsdXNoKSBhbiB1cGRhdGUgdG8gdGhlIERPTSwgYWZ0ZXJcbiAgICAgIC8vIFtgZmx1c2hgXSgjUHJvc2VNaXJyb3IuZXZlbnRfZmx1c2gpIGhhcyBmaXJlZC5cbiAgICAgIHRoaXMuc2lnbmFsKFwiZmx1c2hlZFwiKTtcbiAgICAgIHRoaXMuYWNjdXJhdGVTZWxlY3Rpb24gPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyA6OiAoS2V5bWFwLCA/bnVtYmVyKVxuICAgIC8vIEFkZCBhIFtrZXltYXBdKCNLZXltYXApIHRvIHRoZSBlZGl0b3IuIEtleW1hcHMgYWRkZWQgaW4gdGhpcyB3YXlcbiAgICAvLyBhcmUgcXVlcmllZCBiZWZvcmUgdGhlIFtiYXNlIGtleW1hcF0oI2tleW1hcCkuXG4gICAgLy8gVGhlIGByYW5rYCBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgdG8gY29udHJvbCB3aGVuIHRoZXkgYXJlIHF1ZXJpZWRcbiAgICAvLyByZWxhdGl2ZSB0byBvdGhlciBtYXBzIGFkZGVkIGxpa2UgdGhpcy4gTWFwcyB3aXRoIGEgbG93ZXIgcmFua1xuICAgIC8vIGdldCBxdWVyaWVkIGZpcnN0LlxuICB9LCB7XG4gICAga2V5OiBcImFkZEtleW1hcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRLZXltYXAobWFwKSB7XG4gICAgICB2YXIgcmFuayA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IDUwIDogYXJndW1lbnRzWzFdO1xuXG4gICAgICAoMCwgX3V0aWxTb3J0ZWRpbnNlcnQyW1wiZGVmYXVsdFwiXSkodGhpcy5pbnB1dC5rZXltYXBzLCB7IG1hcDogbWFwLCByYW5rOiByYW5rIH0sIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIHJldHVybiBhLnJhbmsgLSBiLnJhbms7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyA6OiAodW5pb248c3RyaW5nLCBLZXltYXA+KVxuICAgIC8vIFJlbW92ZSB0aGUgZ2l2ZW4ga2V5bWFwLCBvciB0aGUga2V5bWFwIHdpdGggdGhlIGdpdmVuIG5hbWUsIGZyb21cbiAgICAvLyB0aGUgZWRpdG9yLlxuICB9LCB7XG4gICAga2V5OiBcInJlbW92ZUtleW1hcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVLZXltYXAobWFwKSB7XG4gICAgICB2YXIgbWFwcyA9IHRoaXMuaW5wdXQua2V5bWFwcztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFwcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAobWFwc1tpXS5tYXAgPT0gbWFwIHx8IG1hcHNbaV0ubWFwLm9wdGlvbnMubmFtZSA9PSBtYXApIHtcbiAgICAgICAgICBtYXBzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJtYXJrUmFuZ2VcIixcblxuICAgIC8vIDo6IChQb3MsIFBvcywgP09iamVjdCkg4oaSIE1hcmtlZFJhbmdlXG4gICAgLy8gQ3JlYXRlIGEgbWFya2VkIHJhbmdlIGJldHdlZW4gdGhlIGdpdmVuIHBvc2l0aW9ucy4gTWFya2VkIHJhbmdlc1xuICAgIC8vIOKAnHRyYWNr4oCdIHRoZSBwYXJ0IG9mIHRoZSBkb2N1bWVudCB0aGV5IHBvaW50IHRv4oCUYXMgdGhlIGRvY3VtZW50XG4gICAgLy8gY2hhbmdlcywgdGhleSBhcmUgdXBkYXRlZCB0byBtb3ZlLCBncm93LCBhbmQgc2hyaW5rIGFsb25nIHdpdGhcbiAgICAvLyB0aGVpciBjb250ZW50LlxuICAgIC8vXG4gICAgLy8gYG9wdGlvbnNgIG1heSBiZSBhbiBvYmplY3QgY29udGFpbmluZyB0aGVzZSBwcm9wZXJ0aWVzOlxuICAgIC8vXG4gICAgLy8gKipgaW5jbHVzaXZlTGVmdGAqKmA6IGJvb2wgPSBmYWxzZWBcbiAgICAvLyAgIDogV2hldGhlciB0aGUgbGVmdCBzaWRlIG9mIHRoZSByYW5nZSBpcyBpbmNsdXNpdmUuIFdoZW4gaXQgaXMsXG4gICAgLy8gICAgIGNvbnRlbnQgaW5zZXJ0ZWQgYXQgdGhhdCBwb2ludCB3aWxsIGJlY29tZSBwYXJ0IG9mIHRoZSByYW5nZS5cbiAgICAvLyAgICAgV2hlbiBub3QsIGl0IHdpbGwgYmUgb3V0c2lkZSBvZiB0aGUgcmFuZ2UuXG4gICAgLy9cbiAgICAvLyAqKmBpbmNsdXNpdmVSaWdodGAqKmA6IGJvb2wgPSBmYWxzZWBcbiAgICAvLyAgIDogV2hldGhlciB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgcmFuZ2UgaXMgaW5jbHVzaXZlLlxuICAgIC8vXG4gICAgLy8gKipgcmVtb3ZlV2hlbkVtcHR5YCoqYDogYm9vbCA9IHRydWVgXG4gICAgLy8gICA6IFdoZXRoZXIgdGhlIHJhbmdlIHNob3VsZCBiZSBmb3Jnb3R0ZW4gd2hlbiBpdCBiZWNvbWVzIGVtcHR5XG4gICAgLy8gICAgIChiZWNhdXNlIGFsbCBvZiBpdHMgY29udGVudCB3YXMgZGVsZXRlZCkuXG4gICAgLy9cbiAgICAvLyAqKmBjbGFzc05hbWVgKio6IHN0cmluZ1xuICAgIC8vICAgOiBBIENTUyBjbGFzcyB0byBhZGQgdG8gdGhlIGlubGluZSBjb250ZW50IHRoYXQgaXMgcGFydCBvZiB0aGlzXG4gICAgLy8gICAgIHJhbmdlLlxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYXJrUmFuZ2UoZnJvbSwgdG8sIG9wdGlvbnMpIHtcbiAgICAgIHRoaXMuY2hlY2tQb3MoZnJvbSk7XG4gICAgICB0aGlzLmNoZWNrUG9zKHRvKTtcbiAgICAgIHZhciByYW5nZSA9IG5ldyBfcmFuZ2UuTWFya2VkUmFuZ2UoZnJvbSwgdG8sIG9wdGlvbnMpO1xuICAgICAgdGhpcy5yYW5nZXMuYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgcmV0dXJuIHJhbmdlO1xuICAgIH1cblxuICAgIC8vIDo6IChNYXJrZWRSYW5nZSlcbiAgICAvLyBSZW1vdmUgdGhlIGdpdmVuIHJhbmdlIGZyb20gdGhlIGVkaXRvci5cbiAgfSwge1xuICAgIGtleTogXCJyZW1vdmVSYW5nZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVSYW5nZShyYW5nZSkge1xuICAgICAgdGhpcy5yYW5nZXMucmVtb3ZlUmFuZ2UocmFuZ2UpO1xuICAgIH1cblxuICAgIC8vIDo6IChNYXJrVHlwZSwgP2Jvb2wsID9PYmplY3QpXG4gICAgLy8gU2V0ICh3aGVuIGB0b2AgaXMgdHJ1ZSksIHVuc2V0IChgdG9gIGlzIGZhbHNlKSwgb3IgdG9nZ2xlIChgdG9gXG4gICAgLy8gaXMgbnVsbCkgdGhlIGdpdmVuIG1hcmsgdHlwZSBvbiB0aGUgc2VsZWN0aW9uLiBXaGVuIHRoZXJlIGlzIGFcbiAgICAvLyBub24tZW1wdHkgc2VsZWN0aW9uLCB0aGUgbWFya3Mgb2YgdGhlIHNlbGVjdGlvbiBhcmUgdXBkYXRlZC4gV2hlblxuICAgIC8vIHRoZSBzZWxlY3Rpb24gaXMgZW1wdHksIHRoZSBzZXQgb2YgW2FjdGl2ZVxuICAgIC8vIG1hcmtzXSgjUHJvc2VNaXJyb3IuYWN0aXZlTWFya3MpIGlzIHVwZGF0ZWQuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0TWFya1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRNYXJrKHR5cGUsIHRvLCBhdHRycykge1xuICAgICAgdmFyIHNlbCA9IHRoaXMuc2VsZWN0aW9uO1xuICAgICAgaWYgKHNlbC5lbXB0eSkge1xuICAgICAgICB2YXIgbWFya3MgPSB0aGlzLmFjdGl2ZU1hcmtzKCk7XG4gICAgICAgIGlmICh0byA9PSBudWxsKSB0byA9ICF0eXBlLmlzSW5TZXQobWFya3MpO1xuICAgICAgICBpZiAodG8gJiYgIXRoaXMuZG9jLnBhdGgoc2VsLmhlYWQucGF0aCkudHlwZS5jYW5Db250YWluTWFyayh0eXBlKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmlucHV0LnN0b3JlZE1hcmtzID0gdG8gPyB0eXBlLmNyZWF0ZShhdHRycykuYWRkVG9TZXQobWFya3MpIDogdHlwZS5yZW1vdmVGcm9tU2V0KG1hcmtzKTtcbiAgICAgICAgLy8gOjogKCkgI3BhdGg9UHJvc2VNaXJyb3IjZXZlbnRzI2FjdGl2ZU1hcmtDaGFuZ2VcbiAgICAgICAgLy8gRmlyZWQgd2hlbiB0aGUgc2V0IG9mIFthY3RpdmUgbWFya3NdKCNQcm9zZU1pcnJvci5hY3RpdmVNYXJrcykgY2hhbmdlcy5cbiAgICAgICAgdGhpcy5zaWduYWwoXCJhY3RpdmVNYXJrQ2hhbmdlXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRvICE9IG51bGwgPyB0byA6ICF0aGlzLmRvYy5yYW5nZUhhc01hcmsoc2VsLmZyb20sIHNlbC50bywgdHlwZSkpIHRoaXMuYXBwbHkodGhpcy50ci5hZGRNYXJrKHNlbC5mcm9tLCBzZWwudG8sIHR5cGUuY3JlYXRlKGF0dHJzKSkpO2Vsc2UgdGhpcy5hcHBseSh0aGlzLnRyLnJlbW92ZU1hcmsoc2VsLmZyb20sIHNlbC50bywgdHlwZSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDo6ICgpIOKGkiBbTWFya11cbiAgICAvLyBHZXQgdGhlIG1hcmtzIGF0IHRoZSBjdXJzb3IuIEJ5IGRlZmF1bHQsIHRoaXMgeWllbGRzIHRoZSBtYXJrc1xuICAgIC8vIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29udGVudCBhdCB0aGUgY3Vyc29yLCBhcyBwZXIgYE5vZGUubWFya3NBdGAuXG4gICAgLy8gQnV0IGBzZXRNYXJrYCBtYXkgaGF2ZSBiZWVuIHVzZWQgdG8gY2hhbmdlIHRoZSBzZXQgb2YgYWN0aXZlXG4gICAgLy8gbWFya3MsIGluIHdoaWNoIGNhc2UgdGhhdCBzZXQgaXMgcmV0dXJuZWQuXG4gIH0sIHtcbiAgICBrZXk6IFwiYWN0aXZlTWFya3NcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWN0aXZlTWFya3MoKSB7XG4gICAgICB2YXIgaGVhZDtcbiAgICAgIHJldHVybiB0aGlzLmlucHV0LnN0b3JlZE1hcmtzIHx8ICgoaGVhZCA9IHRoaXMuc2VsZWN0aW9uLmhlYWQpID8gdGhpcy5kb2MubWFya3NBdChoZWFkKSA6IFtdKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoKVxuICAgIC8vIEdpdmUgdGhlIGVkaXRvciBmb2N1cy5cbiAgfSwge1xuICAgIGtleTogXCJmb2N1c1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmb2N1cygpIHtcbiAgICAgIGlmICh0aGlzLm9wZXJhdGlvbikgdGhpcy5vcGVyYXRpb24uZm9jdXMgPSB0cnVlO2Vsc2UgdGhpcy5zZWwudG9ET00odHJ1ZSk7XG4gICAgfVxuXG4gICAgLy8gOjogKCkg4oaSIGJvb2xcbiAgICAvLyBRdWVyeSB3aGV0aGVyIHRoZSBlZGl0b3IgaGFzIGZvY3VzLlxuICB9LCB7XG4gICAga2V5OiBcImhhc0ZvY3VzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhc0ZvY3VzKCkge1xuICAgICAgaWYgKHRoaXMuc2VsLnJhbmdlIGluc3RhbmNlb2YgX3NlbGVjdGlvbjIuTm9kZVNlbGVjdGlvbikgcmV0dXJuIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT0gdGhpcy5jb250ZW50O2Vsc2UgcmV0dXJuICgwLCBfc2VsZWN0aW9uMi5oYXNGb2N1cykodGhpcyk7XG4gICAgfVxuXG4gICAgLy8gOjogKCkg4oaSIE5vZGVcbiAgICAvLyBHZXQgdGhlIHBhcnQgb2YgdGhlIGRvY3VtZW50IHRoYXQgZmFsbHMgd2l0aGluIHRoZSBzZWxlY3Rpb24uXG4gIH0sIHtcbiAgICBrZXk6IFwicG9zQXRDb29yZHNcIixcblxuICAgIC8vIDo6ICh7dG9wOiBudW1iZXIsIGxlZnQ6IG51bWJlcn0pIOKGkiA/UG9zXG4gICAgLy8gSWYgdGhlIGdpdmVuIGNvb3JkaW5hdGVzICh3aGljaCBzaG91bGQgYmUgcmVsYXRpdmUgdG8gdGhlIHRvcFxuICAgIC8vIGxlZnQgY29ybmVyIG9mIHRoZSB3aW5kb3figJRub3QgdGhlIHBhZ2UpIGZhbGwgd2l0aGluIHRoZSBlZGl0YWJsZVxuICAgIC8vIGNvbnRlbnQsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBkb2N1bWVudCBwb3NpdGlvbiB0aGF0XG4gICAgLy8gY29ycmVzcG9uZHMgdG8gdGhvc2UgY29vcmRpbmF0ZXMuXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBvc0F0Q29vcmRzKGNvb3Jkcykge1xuICAgICAgcmV0dXJuICgwLCBfc2VsZWN0aW9uMi5wb3NBdENvb3JkcykodGhpcywgY29vcmRzKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoUG9zKSDihpIge3RvcDogbnVtYmVyLCBsZWZ0OiBudW1iZXIsIGJvdHRvbTogbnVtYmVyfVxuICAgIC8vIEZpbmQgdGhlIHNjcmVlbiBjb29yZGluYXRlcyAocmVsYXRpdmUgdG8gdG9wIGxlZnQgY29ybmVyIG9mIHRoZVxuICAgIC8vIHdpbmRvdykgb2YgdGhlIGdpdmVuIGRvY3VtZW50IHBvc2l0aW9uLlxuICB9LCB7XG4gICAga2V5OiBcImNvb3Jkc0F0UG9zXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvb3Jkc0F0UG9zKHBvcykge1xuICAgICAgdGhpcy5jaGVja1Bvcyhwb3MpO1xuICAgICAgcmV0dXJuICgwLCBfc2VsZWN0aW9uMi5jb29yZHNBdFBvcykodGhpcywgcG9zKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoP1BvcylcbiAgICAvLyBTY3JvbGwgdGhlIGdpdmVuIHBvc2l0aW9uLCBvciB0aGUgY3Vyc29yIHBvc2l0aW9uIGlmIGBwb3NgIGlzbid0XG4gICAgLy8gZ2l2ZW4sIGludG8gdmlldy5cbiAgfSwge1xuICAgIGtleTogXCJzY3JvbGxJbnRvVmlld1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzY3JvbGxJbnRvVmlldygpIHtcbiAgICAgIHZhciBwb3MgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyBudWxsIDogYXJndW1lbnRzWzBdO1xuXG4gICAgICBpZiAocG9zKSB0aGlzLmNoZWNrUG9zKHBvcyk7XG4gICAgICB0aGlzLmVuc3VyZU9wZXJhdGlvbigpO1xuICAgICAgdGhpcy5vcGVyYXRpb24uc2Nyb2xsSW50b1ZpZXcgPSBwb3M7XG4gICAgfVxuXG4gICAgLy8gOjogKHN0cmluZywgP1thbnldKSDihpIgYm9vbFxuICAgIC8vIEV4ZWN1dGUgdGhlIG5hbWVkIFtjb21tYW5kXSgjQ29tbWFuZCkuIElmIHRoZSBjb21tYW5kIHRha2VzXG4gICAgLy8gcGFyYW1ldGVycyBhbmQgdGhleSBhcmUgbm90IHBhc3NlZCBoZXJlLCB0aGUgdXNlciB3aWxsIGJlXG4gICAgLy8gcHJvbXB0ZWQgZm9yIHRoZW0uXG4gIH0sIHtcbiAgICBrZXk6IFwiZXhlY0NvbW1hbmRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZXhlY0NvbW1hbmQobmFtZSwgcGFyYW1zKSB7XG4gICAgICB2YXIgY21kID0gdGhpcy5jb21tYW5kc1tuYW1lXTtcbiAgICAgIHJldHVybiAhIShjbWQgJiYgY21kLmV4ZWModGhpcywgcGFyYW1zKSAhPT0gZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIDo6IChzdHJpbmcpIOKGkiA/c3RyaW5nXG4gICAgLy8gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBrZXkgdGhhdCBpcyBib3VuZCB0byB0aGUgZ2l2ZW4gY29tbWFuZCwgaWZcbiAgICAvLyBhbnkuXG4gIH0sIHtcbiAgICBrZXk6IFwia2V5Rm9yQ29tbWFuZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBrZXlGb3JDb21tYW5kKG5hbWUpIHtcbiAgICAgIHZhciBjYWNoZWQgPSB0aGlzLmNvbW1hbmRLZXlzW25hbWVdO1xuICAgICAgaWYgKGNhY2hlZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gY2FjaGVkO1xuXG4gICAgICB2YXIgY21kID0gdGhpcy5jb21tYW5kc1tuYW1lXSxcbiAgICAgICAgICBrZXltYXAgPSB0aGlzLmJhc2VLZXltYXA7XG4gICAgICBpZiAoIWNtZCkgcmV0dXJuIHRoaXMuY29tbWFuZEtleXNbbmFtZV0gPSBudWxsO1xuICAgICAgdmFyIGtleSA9IGNtZC5zcGVjLmtleSB8fCAoX2RvbS5icm93c2VyLm1hYyA/IGNtZC5zcGVjLm1hY0tleSA6IGNtZC5zcGVjLnBjS2V5KTtcbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAga2V5ID0gKDAsIF9rZXlzLm5vcm1hbGl6ZUtleU5hbWUpKEFycmF5LmlzQXJyYXkoa2V5KSA/IGtleVswXSA6IGtleSk7XG4gICAgICAgIHZhciBkZWZsdCA9IGtleW1hcC5iaW5kaW5nc1trZXldO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkZWZsdCkgPyBkZWZsdC5pbmRleE9mKG5hbWUpID4gLTEgOiBkZWZsdCA9PSBuYW1lKSByZXR1cm4gdGhpcy5jb21tYW5kS2V5c1tuYW1lXSA9IGtleTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIF9rZXkgaW4ga2V5bWFwLmJpbmRpbmdzKSB7XG4gICAgICAgIHZhciBib3VuZCA9IGtleW1hcC5iaW5kaW5nc1tfa2V5XTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYm91bmQpID8gYm91bmQuaW5kZXhPZihuYW1lKSA+IC0xIDogYm91bmQgPT0gbmFtZSkgcmV0dXJuIHRoaXMuY29tbWFuZEtleXNbbmFtZV0gPSBfa2V5O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuY29tbWFuZEtleXNbbmFtZV0gPSBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZWdpc3RyeVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZWdpc3RyeShuYW1lLCBmKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdGhpcy5zY2hlbWEucmVnaXN0cnkobmFtZSwgZik7XG4gICAgICB0aGlzLm9wdGlvbnMucmVnaXN0cmllcy5mb3JFYWNoKGZ1bmN0aW9uIChyZWcpIHtcbiAgICAgICAgdmFyIGFycmF5ID0gcmVnLnJlZ2lzdHJ5W25hbWVdO1xuICAgICAgICBpZiAoYXJyYXkpIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIGYoYXJyYXlbaV0sIF90aGlzMik7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibWFya1JhbmdlRGlydHlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWFya1JhbmdlRGlydHkocmFuZ2UpIHtcbiAgICAgIHRoaXMuZW5zdXJlT3BlcmF0aW9uKCk7XG4gICAgICB2YXIgZGlydHkgPSB0aGlzLmRpcnR5Tm9kZXM7XG4gICAgICB2YXIgZnJvbSA9IHJhbmdlLmZyb20sXG4gICAgICAgICAgdG8gPSByYW5nZS50bztcbiAgICAgIGZvciAodmFyIGRlcHRoID0gMCwgbm9kZSA9IHRoaXMuZG9jOzsgZGVwdGgrKykge1xuICAgICAgICB2YXIgZnJvbUVuZCA9IGRlcHRoID09IGZyb20uZGVwdGgsXG4gICAgICAgICAgICB0b0VuZCA9IGRlcHRoID09IHRvLmRlcHRoO1xuICAgICAgICBpZiAoIWZyb21FbmQgJiYgIXRvRW5kICYmIGZyb20ucGF0aFtkZXB0aF0gPT0gdG8ucGF0aFtkZXB0aF0pIHtcbiAgICAgICAgICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkKGZyb20ucGF0aFtkZXB0aF0pO1xuICAgICAgICAgIGlmICghZGlydHkuaGFzKGNoaWxkKSkgZGlydHkuc2V0KGNoaWxkLCBESVJUWV9SRVNDQU4pO1xuICAgICAgICAgIG5vZGUgPSBjaGlsZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgX3JldCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgc3RhcnQgPSBmcm9tRW5kID8gZnJvbS5vZmZzZXQgOiBmcm9tLnBhdGhbZGVwdGhdO1xuICAgICAgICAgICAgdmFyIGVuZCA9IHRvRW5kID8gdG8ub2Zmc2V0IDogdG8ucGF0aFtkZXB0aF0gKyAxO1xuICAgICAgICAgICAgaWYgKG5vZGUuaXNUZXh0YmxvY2spIHtcbiAgICAgICAgICAgICAgbm9kZS5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCwgY1N0YXJ0LCBjRW5kKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNTdGFydCA8IGVuZCAmJiBjRW5kID4gc3RhcnQpIGRpcnR5LnNldChjaGlsZCwgRElSVFlfUkVEUkFXKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBmb3IgKHZhciBpID0gbm9kZS5pdGVyKHN0YXJ0LCBlbmQpLCBjaGlsZCA9IHVuZGVmaW5lZDsgY2hpbGQgPSBpLm5leHQoKS52YWx1ZTspIHtcbiAgICAgICAgICAgICAgICBkaXJ0eS5zZXQoY2hpbGQsIERJUlRZX1JFRFJBVyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBcImJyZWFrXCI7XG4gICAgICAgICAgfSkoKTtcblxuICAgICAgICAgIGlmIChfcmV0ID09PSBcImJyZWFrXCIpIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNlbGVjdGlvblwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgaWYgKCF0aGlzLmFjY3VyYXRlU2VsZWN0aW9uKSB0aGlzLmVuc3VyZU9wZXJhdGlvbigpO1xuICAgICAgcmV0dXJuIHRoaXMuc2VsLnJhbmdlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0clwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIG5ldyBFZGl0b3JUcmFuc2Zvcm0odGhpcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImJhc2VLZXltYXBcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMua2V5bWFwIHx8IHRoaXMuZGVmYXVsdEtleW1hcCB8fCAodGhpcy5kZWZhdWx0S2V5bWFwID0gKDAsIF9jb21tYW5kcy5kZWZhdWx0S2V5bWFwKSh0aGlzKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNlbGVjdGVkRG9jXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICB2YXIgc2VsID0gdGhpcy5zZWxlY3Rpb247XG4gICAgICByZXR1cm4gdGhpcy5kb2Muc2xpY2VCZXR3ZWVuKHNlbC5mcm9tLCBzZWwudG8pO1xuICAgIH1cblxuICAgIC8vIDo6ICgpIOKGkiBzdHJpbmdcbiAgICAvLyBHZXQgdGhlIHRleHQgdGhhdCBmYWxscyB3aXRoaW4gdGhlIHNlbGVjdGlvbi5cbiAgfSwge1xuICAgIGtleTogXCJzZWxlY3RlZFRleHRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiAoMCwgX3NlcmlhbGl6ZVRleHQudG9UZXh0KSh0aGlzLnNlbGVjdGVkRG9jKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUHJvc2VNaXJyb3I7XG59KSgpO1xuXG5leHBvcnRzLlByb3NlTWlycm9yID0gUHJvc2VNaXJyb3I7XG52YXIgRElSVFlfUkVTQ0FOID0gMSxcbiAgICBESVJUWV9SRURSQVcgPSAyO1xuXG5leHBvcnRzLkRJUlRZX1JFU0NBTiA9IERJUlRZX1JFU0NBTjtcbmV4cG9ydHMuRElSVFlfUkVEUkFXID0gRElSVFlfUkVEUkFXO1xudmFyIG51bGxPcHRpb25zID0ge307XG5cbigwLCBfdXRpbEV2ZW50LmV2ZW50TWl4aW4pKFByb3NlTWlycm9yKTtcblxudmFyIE9wZXJhdGlvbiA9IGZ1bmN0aW9uIE9wZXJhdGlvbihwbSkge1xuICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgT3BlcmF0aW9uKTtcblxuICB0aGlzLmRvYyA9IHBtLmRvYztcbiAgdGhpcy5zZWwgPSBwbS5zZWwucmFuZ2U7XG4gIHRoaXMuc2Nyb2xsSW50b1ZpZXcgPSBmYWxzZTtcbiAgdGhpcy5mb2N1cyA9IGZhbHNlO1xuICB0aGlzLmNvbXBvc2luZ0F0U3RhcnQgPSAhIXBtLmlucHV0LmNvbXBvc2luZztcbn1cblxuLy8gOzsgI3RvYz1mYWxzZSBBIHNlbGVjdGlvbi1hd2FyZSBleHRlbnNpb24gb2YgYFRyYW5zZm9ybWAuIFVzZVxuLy8gYFByb3NlTWlycm9yLnRyYCB0byBjcmVhdGUgYW4gaW5zdGFuY2UuXG47XG5cbnZhciBFZGl0b3JUcmFuc2Zvcm0gPSAoZnVuY3Rpb24gKF9UcmFuc2Zvcm0pIHtcbiAgX2luaGVyaXRzKEVkaXRvclRyYW5zZm9ybSwgX1RyYW5zZm9ybSk7XG5cbiAgZnVuY3Rpb24gRWRpdG9yVHJhbnNmb3JtKHBtKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEVkaXRvclRyYW5zZm9ybSk7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihFZGl0b3JUcmFuc2Zvcm0ucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5jYWxsKHRoaXMsIHBtLmRvYyk7XG4gICAgdGhpcy5wbSA9IHBtO1xuICB9XG5cbiAgLy8gOjogKD9PYmplY3QpIOKGkiA/RWRpdG9yVHJhbnNmb3JtXG4gIC8vIEFwcGx5IHRoZSB0cmFuc2Zvcm1hdGlvbi4gUmV0dXJucyB0aGUgdHJhbnNmb3JtLCBvciBgZmFsc2VgIGl0IGlzXG4gIC8vIHdhcyBlbXB0eS5cblxuICBfY3JlYXRlQ2xhc3MoRWRpdG9yVHJhbnNmb3JtLCBbe1xuICAgIGtleTogXCJhcHBseVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhcHBseShvcHRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5wbS5hcHBseSh0aGlzLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvLyA6OiBTZWxlY3Rpb25cbiAgICAvLyBHZXQgdGhlIGVkaXRvcidzIGN1cnJlbnQgc2VsZWN0aW9uLCBbbWFwcGVkXSgjU2VsZWN0aW9uLm1hcClcbiAgICAvLyB0aHJvdWdoIHRoZSBzdGVwcyBpbiB0aGlzIHRyYW5zZm9ybS5cbiAgfSwge1xuICAgIGtleTogXCJyZXBsYWNlU2VsZWN0aW9uXCIsXG5cbiAgICAvLyA6OiAoP05vZGUsID9ib29sKSDihpIgRWRpdG9yVHJhbnNmb3JtXG4gICAgLy8gUmVwbGFjZSB0aGUgc2VsZWN0aW9uIHdpdGggdGhlIGdpdmVuIG5vZGUsIG9yIGRlbGV0ZSBpdCBpZiBgbm9kZWBcbiAgICAvLyBpcyBudWxsLiBXaGVuIGBpbmhlcml0TWFya3NgIGlzIHRydWUgYW5kIHRoZSBub2RlIGlzIGFuIGlubGluZVxuICAgIC8vIG5vZGUsIGl0IGluaGVyaXRzIHRoZSBtYXJrcyBmcm9tIHRoZSBwbGFjZSB3aGVyZSBpdCBpcyBpbnNlcnRlZC5cbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVwbGFjZVNlbGVjdGlvbihub2RlLCBpbmhlcml0TWFya3MpIHtcbiAgICAgIHZhciBfc2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb247XG4gICAgICB2YXIgZW1wdHkgPSBfc2VsZWN0aW9uLmVtcHR5O1xuICAgICAgdmFyIGZyb20gPSBfc2VsZWN0aW9uLmZyb207XG4gICAgICB2YXIgdG8gPSBfc2VsZWN0aW9uLnRvO1xuICAgICAgdmFyIHNlbE5vZGUgPSBfc2VsZWN0aW9uLm5vZGU7dmFyIHBhcmVudCA9IHVuZGVmaW5lZDtcbiAgICAgIGlmIChub2RlICYmIG5vZGUuaXNJbmxpbmUgJiYgaW5oZXJpdE1hcmtzICE9PSBmYWxzZSkge1xuICAgICAgICB2YXIgbWFya3MgPSBlbXB0eSA/IHRoaXMucG0uaW5wdXQuc3RvcmVkTWFya3MgOiB0aGlzLmRvYy5tYXJrc0F0KGZyb20pO1xuICAgICAgICBub2RlID0gbm9kZS50eXBlLmNyZWF0ZShub2RlLmF0dHJzLCBub2RlLnRleHQsIG1hcmtzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNlbE5vZGUgJiYgc2VsTm9kZS5pc1RleHRibG9jayAmJiBub2RlICYmIG5vZGUuaXNJbmxpbmUpIHtcbiAgICAgICAgLy8gUHV0dGluZyBpbmxpbmUgc3R1ZmYgb250byBhIHNlbGVjdGVkIHRleHRibG9jayBwdXRzIGl0IGluc2lkZVxuICAgICAgICBmcm9tID0gbmV3IF9tb2RlbC5Qb3MoZnJvbS50b1BhdGgoKSwgMCk7XG4gICAgICAgIHRvID0gbmV3IF9tb2RlbC5Qb3MoZnJvbS5wYXRoLCBzZWxOb2RlLnNpemUpO1xuICAgICAgfSBlbHNlIGlmIChzZWxOb2RlKSB7XG4gICAgICAgIC8vIFRoaXMgbm9kZSBjYW4gbm90IHNpbXBseSBiZSByZW1vdmVkL3JlcGxhY2VkLiBSZW1vdmUgaXRzIHBhcmVudCBhcyB3ZWxsXG4gICAgICAgIHdoaWxlIChmcm9tLmRlcHRoICYmIGZyb20ub2Zmc2V0ID09IDAgJiYgKHBhcmVudCA9IHRoaXMuZG9jLnBhdGgoZnJvbS5wYXRoKSkgJiYgZnJvbS5vZmZzZXQgPT0gcGFyZW50LnNpemUgLSAxICYmICFwYXJlbnQudHlwZS5jYW5CZUVtcHR5ICYmICEobm9kZSAmJiBwYXJlbnQudHlwZS5jYW5Db250YWluKG5vZGUpKSkge1xuICAgICAgICAgIGZyb20gPSBmcm9tLnNob3J0ZW4oKTtcbiAgICAgICAgICB0byA9IHRvLnNob3J0ZW4obnVsbCwgMSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobm9kZSAmJiBub2RlLmlzQmxvY2sgJiYgdGhpcy5kb2MucGF0aChmcm9tLnBhdGguc2xpY2UoMCwgZnJvbS5kZXB0aCAtIDEpKS50eXBlLmNhbkNvbnRhaW4obm9kZSkpIHtcbiAgICAgICAgLy8gSW5zZXJ0aW5nIGEgYmxvY2sgbm9kZSBpbnRvIGEgdGV4dGJsb2NrLiBUcnkgdG8gaW5zZXJ0IGl0IGFib3ZlIGJ5IHNwbGl0dGluZyB0aGUgdGV4dGJsb2NrXG4gICAgICAgIHRoaXNbXCJkZWxldGVcIl0oZnJvbSwgdG8pO1xuICAgICAgICB2YXIgX3BhcmVudCA9IHRoaXMuZG9jLnBhdGgoZnJvbS5wYXRoKTtcbiAgICAgICAgaWYgKGZyb20ub2Zmc2V0ICYmIGZyb20ub2Zmc2V0ICE9IF9wYXJlbnQuc2l6ZSkgdGhpcy5zcGxpdChmcm9tKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0KGZyb20uc2hvcnRlbihudWxsLCBmcm9tLm9mZnNldCA/IDEgOiAwKSwgbm9kZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlKSByZXR1cm4gdGhpcy5yZXBsYWNlV2l0aChmcm9tLCB0bywgbm9kZSk7ZWxzZSByZXR1cm4gdGhpc1tcImRlbGV0ZVwiXShmcm9tLCB0byk7XG4gICAgfVxuXG4gICAgLy8gOjogKCkg4oaSIEVkaXRvclRyYW5zZm9ybVxuICAgIC8vIERlbGV0ZSB0aGUgc2VsZWN0aW9uLlxuICB9LCB7XG4gICAga2V5OiBcImRlbGV0ZVNlbGVjdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZWxldGVTZWxlY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXBsYWNlU2VsZWN0aW9uKCk7XG4gICAgfVxuXG4gICAgLy8gOjogKHN0cmluZykg4oaSIEVkaXRvclRyYW5zZm9ybVxuICAgIC8vIFJlcGxhY2UgdGhlIHNlbGVjdGlvbiB3aXRoIGEgdGV4dCBub2RlIGNvbnRhaW5pbmcgdGhlIGdpdmVuIHN0cmluZy5cbiAgfSwge1xuICAgIGtleTogXCJ0eXBlVGV4dFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0eXBlVGV4dCh0ZXh0KSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXBsYWNlU2VsZWN0aW9uKHRoaXMucG0uc2NoZW1hLnRleHQodGV4dCksIHRydWUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZWxlY3Rpb25cIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0ZXBzLmxlbmd0aCA/IHRoaXMucG0uc2VsZWN0aW9uLm1hcCh0aGlzKSA6IHRoaXMucG0uc2VsZWN0aW9uO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBFZGl0b3JUcmFuc2Zvcm07XG59KShfdHJhbnNmb3JtLlRyYW5zZm9ybSk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZXhwb3J0cy5kZWZpbmVPcHRpb24gPSBkZWZpbmVPcHRpb247XG5leHBvcnRzLnBhcnNlT3B0aW9ucyA9IHBhcnNlT3B0aW9ucztcbmV4cG9ydHMuaW5pdE9wdGlvbnMgPSBpbml0T3B0aW9ucztcbmV4cG9ydHMuc2V0T3B0aW9uID0gc2V0T3B0aW9uO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgX21vZGVsID0gcmVxdWlyZShcIi4uL21vZGVsXCIpO1xuXG4vLyA7OyBBIHJlZ2lzdHJ5IGlzIGEgbmFtZXNwYWNlIGZvciBbY29tbWFuZHNdKCNDb21tYW5kcyksIGlucHV0XG4vLyBydWxlcywgYW5kIHNvIG9uLiBUaGV5IHByb3ZpZGUgYSB3YXkgdG8gZGVmaW5lIGNvbW1hbmRzIGFuZCBzdWNoIGluXG4vLyBhIHNjb3BlZCB3YXksIHdpdGhvdXQgaGF2aW5nIHRoZW0gc2hvdyB1cCBvbiBhbGwgeW91ciBlZGl0b3JzIGJ5XG4vLyBkZWZhdWx0IGFsbCBvZiBhIHN1ZGRlbi4gU2VlIGFsc28gdGhlIFtgcmVnaXN0cmllc2Bcbi8vIG9wdGlvbl0oI3JlZ2lzdHJpZXMpLlxuXG52YXIgUmVnaXN0cnkgPSAoZnVuY3Rpb24gKCkge1xuICAvLyA6OiAoc3RyaW5nKVxuICAvLyBDcmVhdGUgYSBuZXcgcmVnaXN0cnkgd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cblxuICBmdW5jdGlvbiBSZWdpc3RyeShuYW1lKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJlZ2lzdHJ5KTtcblxuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5yZWdpc3RyeSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIH1cblxuICAvLyA6OiBSZWdpc3RyeVxuICAvLyBUaGUgcmVnaXN0cnkgaW4gd2hpY2ggYnVpbHQtaW4gY29tbWFuZHMgYW5kIGlucHV0IHJ1bGVzIGFyZVxuICAvLyByZWdpc3RlcmVkLiBUaGUgZGVmYXVsdCBjb250ZW50IG9mIHRoZSBgcmVnaXN0cmllc2Agb3B0aW9uLlxuXG4gIC8vIDo6IChzdHJpbmcsICopXG4gIC8vIFJlZ2lzdGVyIGEgbmV3IGl0ZW0gaW4gdGhpcyByZWdpc3RyeS5cblxuICBfY3JlYXRlQ2xhc3MoUmVnaXN0cnksIFt7XG4gICAga2V5OiBcInJlZ2lzdGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlZ2lzdGVyKG5hbWUsIHZhbHVlKSB7XG4gICAgICA7KHRoaXMucmVnaXN0cnlbbmFtZV0gfHwgKHRoaXMucmVnaXN0cnlbbmFtZV0gPSBbXSkpLnB1c2godmFsdWUpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBSZWdpc3RyeTtcbn0pKCk7XG5cbmV4cG9ydHMuUmVnaXN0cnkgPSBSZWdpc3RyeTtcbnZhciBkZWZhdWx0UmVnaXN0cnkgPSBuZXcgUmVnaXN0cnkoXCJkZWZhdWx0XCIpO1xuXG5leHBvcnRzLmRlZmF1bHRSZWdpc3RyeSA9IGRlZmF1bHRSZWdpc3RyeTtcblxudmFyIE9wdGlvbiA9IGZ1bmN0aW9uIE9wdGlvbihkZWZhdWx0VmFsdWUsIHVwZGF0ZSwgdXBkYXRlT25Jbml0KSB7XG4gIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBPcHRpb24pO1xuXG4gIHRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICB0aGlzLnVwZGF0ZSA9IHVwZGF0ZTtcbiAgdGhpcy51cGRhdGVPbkluaXQgPSB1cGRhdGVPbkluaXQgIT09IGZhbHNlO1xufTtcblxudmFyIG9wdGlvbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4vLyA6OiAoc3RyaW5nLCBhbnksIChwbTogUHJvc2VNaXJyb3IsIG5ld1ZhbHVlOiBhbnksIG9sZFZhbHVlOiBhbnksIGluaXQ6IGJvb2wpLCBib29sKVxuLy8gRGVmaW5lIGEgbmV3IG9wdGlvbi4gVGhlIGB1cGRhdGVgIGhhbmRsZXIgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGVcbi8vIG9wdGlvbidzIG9sZCBhbmQgbmV3IHZhbHVlIGV2ZXJ5IHRpbWUgdGhlIG9wdGlvbiBpc1xuLy8gW2NoYW5nZWRdKCNQcm9zZU1pcnJvci5zZXRPcHRpb24pLiBXaGVuIGB1cGRhdGVPbkluaXRgIGlzIHRydWUsIGl0XG4vLyBpcyBhbHNvIGNhbGxlZCBvbiBlZGl0b3IgaW5pdCwgd2l0aCBudWxsIGFzIHRoZSBvbGQgdmFsdWUsIGFuZCBhIGZvdXJ0aFxuLy8gYXJndW1lbnQgb2YgdHJ1ZS5cblxuZnVuY3Rpb24gZGVmaW5lT3B0aW9uKG5hbWUsIGRlZmF1bHRWYWx1ZSwgdXBkYXRlLCB1cGRhdGVPbkluaXQpIHtcbiAgb3B0aW9uc1tuYW1lXSA9IG5ldyBPcHRpb24oZGVmYXVsdFZhbHVlLCB1cGRhdGUsIHVwZGF0ZU9uSW5pdCk7XG59XG5cbi8vIDo6IFNjaGVtYSAjcGF0aD1zY2hlbWEgI2tpbmQ9b3B0aW9uXG4vLyBUaGUgW3NjaGVtYV0oI1NjaGVtYSkgdGhhdCB0aGUgZWRpdG9yJ3MgZG9jdW1lbnQgc2hvdWxkIHVzZS5cbmRlZmluZU9wdGlvbihcInNjaGVtYVwiLCBfbW9kZWwuZGVmYXVsdFNjaGVtYSwgZmFsc2UpO1xuXG4vLyA6OiBhbnkgI3BhdGg9ZG9jICNraW5kPW9wdGlvblxuLy8gVGhlIHN0YXJ0aW5nIGRvY3VtZW50LiBVc3VhbGx5IGEgYE5vZGVgLCBidXQgY2FuIGJlIGluIGFub3RoZXJcbi8vIGZvcm1hdCB3aGVuIHRoZSBgZG9jRm9ybWF0YCBvcHRpb24gaXMgYWxzbyBzcGVjaWZpZWQuXG5kZWZpbmVPcHRpb24oXCJkb2NcIiwgbnVsbCwgZnVuY3Rpb24gKHBtLCB2YWx1ZSkge1xuICByZXR1cm4gcG0uc2V0RG9jKHZhbHVlKTtcbn0sIGZhbHNlKTtcblxuLy8gOjogP3N0cmluZyAjcGF0aD1kb2NGb3JtYXQgI2tpbmQ9b3B0aW9uXG4vLyBUaGUgZm9ybWF0IGluIHdoaWNoIHRoZSBgZG9jYCBvcHRpb24gaXMgZ2l2ZW4uIERlZmF1bHRzIHRvIGBudWxsYFxuLy8gKGEgcmF3IGBOb2RlYCkuXG5kZWZpbmVPcHRpb24oXCJkb2NGb3JtYXRcIiwgbnVsbCk7XG5cbi8vIDo6ID91bmlvbjxET01Ob2RlLCAoRE9NTm9kZSk+ICNwYXRoPXBsYWNlICNraW5kPW9wdGlvblxuLy8gRGV0ZXJtaW5lcyB0aGUgcGxhY2VtZW50IG9mIHRoZSBlZGl0b3IgaW4gdGhlIHBhZ2UuIFdoZW4gYG51bGxgLFxuLy8gdGhlIGVkaXRvciBpcyBub3QgcGxhY2VkLiBXaGVuIGEgRE9NIG5vZGUgaXMgZ2l2ZW4sIHRoZSBlZGl0b3IgaXNcbi8vIGFwcGVuZGVkIHRvIHRoYXQgbm9kZS4gV2hlbiBhIGZ1bmN0aW9uIGlzIGdpdmVuLCBpdCBpcyBjYWxsZWRcbi8vIHdpdGggdGhlIGVkaXRvcidzIHdyYXBwaW5nIERPTSBub2RlLCBhbmQgaXMgZXhwZWN0ZWQgdG8gcGxhY2UgaXRcbi8vIGludG8gdGhlIGRvY3VtZW50LlxuZGVmaW5lT3B0aW9uKFwicGxhY2VcIiwgbnVsbCk7XG5cbi8vIDo6IEtleW1hcCAjcGF0aD1rZXltYXAgI2tpbmQ9b3B0aW9uXG4vLyBUaGUgYmFzZSBba2V5bWFwXSgjS2V5bWFwKS4gV2hlbiBub3QgZ2l2ZW4sIGEgZGVmYXVsdCBrZXltYXAgaXNcbi8vIHN5bnRoZXNpemVkIGZyb20gdGhlIGRlZmF1bHQga2V5IGJpbmRpbmdzIHByb3ZpZGVkIGJ5IHRoZVxuLy8gW2NvbW1hbmRzXSgjQ29tbWFuZCkgdGhhdCBhcmUgaW4gc2NvcGUgZm9yIHRoZSBlZGl0b3IuXG5kZWZpbmVPcHRpb24oXCJrZXltYXBcIiwgbnVsbCk7XG5cbi8vIDo6IFtSZWdpc3RyeV1cbi8vIFRoZSBzZXQgb2YgW3JlZ2lzdHJpZXNdKCNSZWdpc3RyeSkgdGhlIGVkaXRvciBzaG91bGQgbG9hZCBpdGVtc1xuLy8gZnJvbS5cbmRlZmluZU9wdGlvbihcInJlZ2lzdHJpZXNcIiwgW2RlZmF1bHRSZWdpc3RyeV0sIGZhbHNlKTtcblxuLy8gOjogbnVtYmVyICNwYXRoPWhpc3RvcnlEZXB0aCAja2luZD1vcHRpb25cbi8vIFRoZSBhbW91bnQgb2YgaGlzdG9yeSBldmVudHMgdGhhdCBhcmUgY29sbGVjdGVkIGJlZm9yZSB0aGUgb2xkZXN0XG4vLyBldmVudHMgYXJlIGRpc2NhcmRlZC4gRGVmYXVsdHMgdG8gMTAwLlxuZGVmaW5lT3B0aW9uKFwiaGlzdG9yeURlcHRoXCIsIDEwMCk7XG5cbi8vIDo6IG51bWJlciAjcGF0aD1oaXN0b3J5RXZlbnREZWxheSAja2luZD1vcHRpb25cbi8vIFRoZSBhbW91bnQgb2YgbWlsbGlzZWNvbmRzIHRoYXQgbXVzdCBwYXNzIGJldHdlZW4gY2hhbmdlcyB0b1xuLy8gc3RhcnQgYSBuZXcgaGlzdG9yeSBldmVudC4gRGVmYXVsdHMgdG8gNTAwLlxuZGVmaW5lT3B0aW9uKFwiaGlzdG9yeUV2ZW50RGVsYXlcIiwgNTAwKTtcblxuLy8gOjogc3RyaW5nICNwYXRoPWNvbW1hbmRQYXJhbUhhbmRsZXIgI2tpbmQ9b3B0aW9uXG4vLyBUaGUgbmFtZSBvZiB0aGUgaGFuZGxlciB1c2VkIHRvIHByb21wdCB0aGUgdXNlciBmb3IgW2NvbW1hbmRcbi8vIHBhcmFtZXRlcnNdKCNDb21tYW5kUGFyYW0pLiBPbmx5IHJlbGV2YW50IHdoZW4gbXVsdGlwbGUgc3VjaFxuLy8gaGFuZGxlcnMgYXJlIGxvYWRlZCwgYW5kIHlvdSB3YW50IHRvIGNob29zZSBiZXR3ZWVuIHRoZW0uXG5kZWZpbmVPcHRpb24oXCJjb21tYW5kUGFyYW1IYW5kbGVyXCIsIFwiZGVmYXVsdFwiKTtcblxuLy8gOjogP3N0cmluZyAjcGF0aD1sYWJlbCAja2luZD1vcHRpb25cbi8vIFRoZSBsYWJlbCBvZiB0aGUgZWRpdG9yLiBXaGVuIHNldCwgdGhlIGVkaXRhYmxlIERPTSBub2RlIGdldHMgYW5cbi8vIGBhcmlhLWxhYmVsYCBhdHRyaWJ1dGUgd2l0aCB0aGlzIHZhbHVlLlxuZGVmaW5lT3B0aW9uKFwibGFiZWxcIiwgbnVsbCk7XG5cbmZ1bmN0aW9uIHBhcnNlT3B0aW9ucyhvYmopIHtcbiAgdmFyIHJlc3VsdCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHZhciBnaXZlbiA9IG9iaiA/IFtvYmpdLmNvbmNhdChvYmoudXNlIHx8IFtdKSA6IFtdO1xuICBvdXRlcjogZm9yICh2YXIgb3B0IGluIG9wdGlvbnMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdpdmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAob3B0IGluIGdpdmVuW2ldKSB7XG4gICAgICAgIHJlc3VsdFtvcHRdID0gZ2l2ZW5baV1bb3B0XTtcbiAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICB9XG4gICAgfVxuICAgIHJlc3VsdFtvcHRdID0gb3B0aW9uc1tvcHRdLmRlZmF1bHRWYWx1ZTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBpbml0T3B0aW9ucyhwbSkge1xuICBmb3IgKHZhciBvcHQgaW4gb3B0aW9ucykge1xuICAgIHZhciBkZXNjID0gb3B0aW9uc1tvcHRdO1xuICAgIGlmIChkZXNjLnVwZGF0ZSAmJiBkZXNjLnVwZGF0ZU9uSW5pdCkgZGVzYy51cGRhdGUocG0sIHBtLm9wdGlvbnNbb3B0XSwgbnVsbCwgdHJ1ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0T3B0aW9uKHBtLCBuYW1lLCB2YWx1ZSkge1xuICB2YXIgZGVzYyA9IG9wdGlvbnNbbmFtZV07XG4gIGlmIChkZXNjLnVwZGF0ZSA9PT0gZmFsc2UpIHRocm93IG5ldyBFcnJvcihcIk9wdGlvbiAnXCIgKyBuYW1lICsgXCInIGNhbiBub3QgYmUgY2hhbmdlZFwiKTtcbiAgdmFyIG9sZCA9IHBtLm9wdGlvbnNbbmFtZV07XG4gIHBtLm9wdGlvbnNbbmFtZV0gPSB2YWx1ZTtcbiAgaWYgKGRlc2MudXBkYXRlKSBkZXNjLnVwZGF0ZShwbSwgdmFsdWUsIG9sZCwgZmFsc2UpO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBfdXRpbEV2ZW50ID0gcmVxdWlyZShcIi4uL3V0aWwvZXZlbnRcIik7XG5cbi8vIDs7IEEgW21hcmtlZCByYW5nZV0oI1Byb3NlTWlycm9yLm1hcmtSYW5nZSkuIEluY2x1ZGVzIHRoZSBtZXRob2RzXG4vLyBmcm9tIHRoZSBbZXZlbnQgbWl4aW5dKCNFdmVudE1peGluKS5cblxudmFyIE1hcmtlZFJhbmdlID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTWFya2VkUmFuZ2UoZnJvbSwgdG8sIG9wdGlvbnMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTWFya2VkUmFuZ2UpO1xuXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAvLyA6OiA/UG9zXG4gICAgLy8gVGhlIGN1cnJlbnQgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHJhbmdlLiBVcGRhdGVkIHdoZW5ldmVyIHRoZVxuICAgIC8vIGVkaXRvcidzIGRvY3VtZW50IGlzIGNoYW5nZWQuIFNldCB0byBgbnVsbGAgd2hlbiB0aGUgbWFya2VkXG4gICAgLy8gcmFuZ2UgaXMgW3JlbW92ZWRdKCNQcm9zZU1pcnJvci5yZW1vdmVSYW5nZSkuXG4gICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICAvLyA6OiA/UG9zXG4gICAgLy8gVGhlIGN1cnJlbnQgZW5kIHBvc2l0aW9uIG9mIHRoZSByYW5nZS4gVXBkYXRlZCB3aGVuZXZlciB0aGVcbiAgICAvLyBlZGl0b3IncyBkb2N1bWVudCBpcyBjaGFuZ2VkLiBTZXQgdG8gYG51bGxgIHdoZW4gdGhlIG1hcmtlZFxuICAgIC8vIHJhbmdlIGlzIFtyZW1vdmVkXSgjUHJvc2VNaXJyb3IucmVtb3ZlUmFuZ2UpLlxuICAgIHRoaXMudG8gPSB0bztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhNYXJrZWRSYW5nZSwgW3tcbiAgICBrZXk6IFwicmVtb3ZlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgICAgIC8vIDo6IChmcm9tOiBQb3MsIHRvOiBQb3MpICNwYXRoPU1hcmtlZFJhbmdlI2V2ZW50cyNyZW1vdmVkXG4gICAgICAvLyBTaWduYWxsZWQgd2hlbiB0aGUgbWFya2VkIHJhbmdlIGlzIHJlbW92ZWQgZnJvbSB0aGUgZWRpdG9yLlxuICAgICAgdGhpcy5zaWduYWwoXCJyZW1vdmVkXCIsIHRoaXMuZnJvbSwgdGhpcy50by5tYXgodGhpcy5mcm9tKSk7XG4gICAgICB0aGlzLmZyb20gPSB0aGlzLnRvID0gbnVsbDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gTWFya2VkUmFuZ2U7XG59KSgpO1xuXG5leHBvcnRzLk1hcmtlZFJhbmdlID0gTWFya2VkUmFuZ2U7XG5cbigwLCBfdXRpbEV2ZW50LmV2ZW50TWl4aW4pKE1hcmtlZFJhbmdlKTtcblxudmFyIFJhbmdlU29ydGVyID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUmFuZ2VTb3J0ZXIoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJhbmdlU29ydGVyKTtcblxuICAgIHRoaXMuc29ydGVkID0gW107XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoUmFuZ2VTb3J0ZXIsIFt7XG4gICAga2V5OiBcImZpbmRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZmluZChhdCkge1xuICAgICAgdmFyIG1pbiA9IDAsXG4gICAgICAgICAgbWF4ID0gdGhpcy5zb3J0ZWQubGVuZ3RoO1xuICAgICAgZm9yICg7Oykge1xuICAgICAgICBpZiAobWF4IDwgbWluICsgMTApIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gbWluOyBpIDwgbWF4OyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNvcnRlZFtpXS5hdC5jbXAoYXQpID49IDApIHJldHVybiBpO1xuICAgICAgICAgIH1yZXR1cm4gbWF4O1xuICAgICAgICB9XG4gICAgICAgIHZhciBtaWQgPSBtaW4gKyBtYXggPj4gMTtcbiAgICAgICAgaWYgKHRoaXMuc29ydGVkW21pZF0uYXQuY21wKGF0KSA+IDApIG1heCA9IG1pZDtlbHNlIG1pbiA9IG1pZDtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW5zZXJ0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluc2VydChvYmopIHtcbiAgICAgIHRoaXMuc29ydGVkLnNwbGljZSh0aGlzLmZpbmQob2JqLmF0KSwgMCwgb2JqKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVtb3ZlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZShhdCwgcmFuZ2UpIHtcbiAgICAgIHZhciBwb3MgPSB0aGlzLmZpbmQoYXQpO1xuICAgICAgZm9yICh2YXIgZGlzdCA9IDA7OyBkaXN0KyspIHtcbiAgICAgICAgdmFyIGxlZnRQb3MgPSBwb3MgLSBkaXN0IC0gMSxcbiAgICAgICAgICAgIHJpZ2h0UG9zID0gcG9zICsgZGlzdDtcbiAgICAgICAgaWYgKGxlZnRQb3MgPj0gMCAmJiB0aGlzLnNvcnRlZFtsZWZ0UG9zXS5yYW5nZSA9PSByYW5nZSkge1xuICAgICAgICAgIHRoaXMuc29ydGVkLnNwbGljZShsZWZ0UG9zLCAxKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSBpZiAocmlnaHRQb3MgPCB0aGlzLnNvcnRlZC5sZW5ndGggJiYgdGhpcy5zb3J0ZWRbcmlnaHRQb3NdLnJhbmdlID09IHJhbmdlKSB7XG4gICAgICAgICAgdGhpcy5zb3J0ZWQuc3BsaWNlKHJpZ2h0UG9zLCAxKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVzb3J0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc29ydCgpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zb3J0ZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGN1ciA9IHRoaXMuc29ydGVkW2ldO1xuICAgICAgICB2YXIgYXQgPSBjdXIuYXQgPSBjdXIudHlwZSA9PSBcIm9wZW5cIiA/IGN1ci5yYW5nZS5mcm9tIDogY3VyLnJhbmdlLnRvO1xuICAgICAgICB2YXIgcG9zID0gaTtcbiAgICAgICAgd2hpbGUgKHBvcyA+IDAgJiYgdGhpcy5zb3J0ZWRbcG9zIC0gMV0uYXQuY21wKGF0KSA+IDApIHtcbiAgICAgICAgICB0aGlzLnNvcnRlZFtwb3NdID0gdGhpcy5zb3J0ZWRbcG9zIC0gMV07XG4gICAgICAgICAgdGhpcy5zb3J0ZWRbLS1wb3NdID0gY3VyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFJhbmdlU29ydGVyO1xufSkoKTtcblxudmFyIFJhbmdlU3RvcmUgPSAoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBSYW5nZVN0b3JlKHBtKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJhbmdlU3RvcmUpO1xuXG4gICAgdGhpcy5wbSA9IHBtO1xuICAgIHRoaXMucmFuZ2VzID0gW107XG4gICAgdGhpcy5zb3J0ZWQgPSBuZXcgUmFuZ2VTb3J0ZXIoKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhSYW5nZVN0b3JlLCBbe1xuICAgIGtleTogXCJhZGRSYW5nZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRSYW5nZShyYW5nZSkge1xuICAgICAgdGhpcy5yYW5nZXMucHVzaChyYW5nZSk7XG4gICAgICB0aGlzLnNvcnRlZC5pbnNlcnQoeyB0eXBlOiBcIm9wZW5cIiwgYXQ6IHJhbmdlLmZyb20sIHJhbmdlOiByYW5nZSB9KTtcbiAgICAgIHRoaXMuc29ydGVkLmluc2VydCh7IHR5cGU6IFwiY2xvc2VcIiwgYXQ6IHJhbmdlLnRvLCByYW5nZTogcmFuZ2UgfSk7XG4gICAgICB0aGlzLnBtLm1hcmtSYW5nZURpcnR5KHJhbmdlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVtb3ZlUmFuZ2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlUmFuZ2UocmFuZ2UpIHtcbiAgICAgIHZhciBmb3VuZCA9IHRoaXMucmFuZ2VzLmluZGV4T2YocmFuZ2UpO1xuICAgICAgaWYgKGZvdW5kID4gLTEpIHtcbiAgICAgICAgdGhpcy5yYW5nZXMuc3BsaWNlKGZvdW5kLCAxKTtcbiAgICAgICAgdGhpcy5zb3J0ZWQucmVtb3ZlKHJhbmdlLmZyb20sIHJhbmdlKTtcbiAgICAgICAgdGhpcy5zb3J0ZWQucmVtb3ZlKHJhbmdlLnRvLCByYW5nZSk7XG4gICAgICAgIHRoaXMucG0ubWFya1JhbmdlRGlydHkocmFuZ2UpO1xuICAgICAgICByYW5nZS5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidHJhbnNmb3JtXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRyYW5zZm9ybShtYXBwaW5nKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciByYW5nZSA9IHRoaXMucmFuZ2VzW2ldO1xuICAgICAgICByYW5nZS5mcm9tID0gbWFwcGluZy5tYXAocmFuZ2UuZnJvbSwgcmFuZ2Uub3B0aW9ucy5pbmNsdXNpdmVMZWZ0ID8gLTEgOiAxKS5wb3M7XG4gICAgICAgIHJhbmdlLnRvID0gbWFwcGluZy5tYXAocmFuZ2UudG8sIHJhbmdlLm9wdGlvbnMuaW5jbHVzaXZlUmlnaHQgPyAxIDogLTEpLnBvcztcbiAgICAgICAgdmFyIGRpZmYgPSByYW5nZS5mcm9tLmNtcChyYW5nZS50byk7XG4gICAgICAgIGlmIChyYW5nZS5vcHRpb25zLnJlbW92ZVdoZW5FbXB0eSAhPT0gZmFsc2UgJiYgZGlmZiA+PSAwKSB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVSYW5nZShyYW5nZSk7XG4gICAgICAgICAgaS0tO1xuICAgICAgICB9IGVsc2UgaWYgKGRpZmYgPiAwKSB7XG4gICAgICAgICAgcmFuZ2UudG8gPSByYW5nZS5mcm9tO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnNvcnRlZC5yZXNvcnQoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWN0aXZlUmFuZ2VUcmFja2VyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFjdGl2ZVJhbmdlVHJhY2tlcigpIHtcbiAgICAgIHJldHVybiBuZXcgUmFuZ2VUcmFja2VyKHRoaXMuc29ydGVkLnNvcnRlZCk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFJhbmdlU3RvcmU7XG59KSgpO1xuXG5leHBvcnRzLlJhbmdlU3RvcmUgPSBSYW5nZVN0b3JlO1xuXG52YXIgUmFuZ2VUcmFja2VyID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUmFuZ2VUcmFja2VyKHNvcnRlZCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBSYW5nZVRyYWNrZXIpO1xuXG4gICAgdGhpcy5zb3J0ZWQgPSBzb3J0ZWQ7XG4gICAgdGhpcy5wb3MgPSAwO1xuICAgIHRoaXMuY3VycmVudCA9IFtdO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFJhbmdlVHJhY2tlciwgW3tcbiAgICBrZXk6IFwiYWR2YW5jZVRvXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkdmFuY2VUbyhwb3MpIHtcbiAgICAgIHZhciBuZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgd2hpbGUgKHRoaXMucG9zIDwgdGhpcy5zb3J0ZWQubGVuZ3RoICYmIChuZXh0ID0gdGhpcy5zb3J0ZWRbdGhpcy5wb3NdKS5hdC5jbXAocG9zKSA8PSAwKSB7XG4gICAgICAgIHZhciBjbGFzc05hbWUgPSBuZXh0LnJhbmdlLm9wdGlvbnMuY2xhc3NOYW1lO1xuICAgICAgICBpZiAoIWNsYXNzTmFtZSkgY29udGludWU7XG4gICAgICAgIGlmIChuZXh0LnR5cGUgPT0gXCJvcGVuXCIpIHRoaXMuY3VycmVudC5wdXNoKGNsYXNzTmFtZSk7ZWxzZSB0aGlzLmN1cnJlbnQuc3BsaWNlKHRoaXMuY3VycmVudC5pbmRleE9mKGNsYXNzTmFtZSksIDEpO1xuICAgICAgICB0aGlzLnBvcysrO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJuZXh0Q2hhbmdlQmVmb3JlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5leHRDaGFuZ2VCZWZvcmUocG9zKSB7XG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIGlmICh0aGlzLnBvcyA9PSB0aGlzLnNvcnRlZC5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgICAgICB2YXIgbmV4dCA9IHRoaXMuc29ydGVkW3RoaXMucG9zXTtcbiAgICAgICAgaWYgKCFuZXh0LnJhbmdlLm9wdGlvbnMuY2xhc3NOYW1lKSB0aGlzLnBvcysrO2Vsc2UgaWYgKG5leHQuYXQuY21wKHBvcykgPj0gMCkgcmV0dXJuIG51bGw7ZWxzZSByZXR1cm4gbmV4dC5hdC5vZmZzZXQ7XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFJhbmdlVHJhY2tlcjtcbn0pKCk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfZ2V0ID0gZnVuY3Rpb24gZ2V0KF94LCBfeDIsIF94MykgeyB2YXIgX2FnYWluID0gdHJ1ZTsgX2Z1bmN0aW9uOiB3aGlsZSAoX2FnYWluKSB7IHZhciBvYmplY3QgPSBfeCwgcHJvcGVydHkgPSBfeDIsIHJlY2VpdmVyID0gX3gzOyBfYWdhaW4gPSBmYWxzZTsgaWYgKG9iamVjdCA9PT0gbnVsbCkgb2JqZWN0ID0gRnVuY3Rpb24ucHJvdG90eXBlOyB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSk7IGlmIChkZXNjID09PSB1bmRlZmluZWQpIHsgdmFyIHBhcmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmplY3QpOyBpZiAocGFyZW50ID09PSBudWxsKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gZWxzZSB7IF94ID0gcGFyZW50OyBfeDIgPSBwcm9wZXJ0eTsgX3gzID0gcmVjZWl2ZXI7IF9hZ2FpbiA9IHRydWU7IGRlc2MgPSBwYXJlbnQgPSB1bmRlZmluZWQ7IGNvbnRpbnVlIF9mdW5jdGlvbjsgfSB9IGVsc2UgaWYgKFwidmFsdWVcIiBpbiBkZXNjKSB7IHJldHVybiBkZXNjLnZhbHVlOyB9IGVsc2UgeyB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7IGlmIChnZXR0ZXIgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IHJldHVybiBnZXR0ZXIuY2FsbChyZWNlaXZlcik7IH0gfSB9O1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbmV4cG9ydHMucG9zRnJvbURPTSA9IHBvc0Zyb21ET007XG5leHBvcnRzLnJhbmdlRnJvbURPTUxvb3NlID0gcmFuZ2VGcm9tRE9NTG9vc2U7XG5leHBvcnRzLmZpbmRCeVBhdGggPSBmaW5kQnlQYXRoO1xuZXhwb3J0cy5yZXNvbHZlUGF0aCA9IHJlc29sdmVQYXRoO1xuZXhwb3J0cy5oYXNGb2N1cyA9IGhhc0ZvY3VzO1xuZXhwb3J0cy5wb3NBdENvb3JkcyA9IHBvc0F0Q29vcmRzO1xuZXhwb3J0cy5jb29yZHNBdFBvcyA9IGNvb3Jkc0F0UG9zO1xuZXhwb3J0cy5zY3JvbGxJbnRvVmlldyA9IHNjcm9sbEludG9WaWV3O1xuZXhwb3J0cy5maW5kU2VsZWN0aW9uRnJvbSA9IGZpbmRTZWxlY3Rpb25Gcm9tO1xuZXhwb3J0cy5maW5kU2VsZWN0aW9uTmVhciA9IGZpbmRTZWxlY3Rpb25OZWFyO1xuZXhwb3J0cy5maW5kU2VsZWN0aW9uQXRTdGFydCA9IGZpbmRTZWxlY3Rpb25BdFN0YXJ0O1xuZXhwb3J0cy5maW5kU2VsZWN0aW9uQXRFbmQgPSBmaW5kU2VsZWN0aW9uQXRFbmQ7XG5leHBvcnRzLnNlbGVjdGFibGVOb2RlQWJvdmUgPSBzZWxlY3RhYmxlTm9kZUFib3ZlO1xuZXhwb3J0cy5oYW5kbGVOb2RlQ2xpY2sgPSBoYW5kbGVOb2RlQ2xpY2s7XG5leHBvcnRzLnZlcnRpY2FsTW90aW9uTGVhdmVzVGV4dGJsb2NrID0gdmVydGljYWxNb3Rpb25MZWF2ZXNUZXh0YmxvY2s7XG5leHBvcnRzLnNldERPTVNlbGVjdGlvblRvUG9zID0gc2V0RE9NU2VsZWN0aW9uVG9Qb3M7XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgX21vZGVsID0gcmVxdWlyZShcIi4uL21vZGVsXCIpO1xuXG52YXIgX2RvbSA9IHJlcXVpcmUoXCIuLi9kb21cIik7XG5cbnZhciBTZWxlY3Rpb25TdGF0ZSA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFNlbGVjdGlvblN0YXRlKHBtKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBTZWxlY3Rpb25TdGF0ZSk7XG5cbiAgICB0aGlzLnBtID0gcG07XG5cbiAgICB0aGlzLnJhbmdlID0gZmluZFNlbGVjdGlvbkF0U3RhcnQocG0uZG9jKTtcbiAgICB0aGlzLmxhc3ROb25Ob2RlUG9zID0gbnVsbDtcblxuICAgIHRoaXMucG9sbFN0YXRlID0gbnVsbDtcbiAgICB0aGlzLnBvbGxUaW1lb3V0ID0gbnVsbDtcbiAgICB0aGlzLmxhc3RBbmNob3JOb2RlID0gdGhpcy5sYXN0SGVhZE5vZGUgPSB0aGlzLmxhc3RBbmNob3JPZmZzZXQgPSB0aGlzLmxhc3RIZWFkT2Zmc2V0ID0gbnVsbDtcbiAgICB0aGlzLmxhc3ROb2RlID0gbnVsbDtcblxuICAgIHBtLmNvbnRlbnQuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdGhpcy5yZWNlaXZlZEZvY3VzKCk7XG4gICAgfSk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoU2VsZWN0aW9uU3RhdGUsIFt7XG4gICAga2V5OiBcInNldEFuZFNpZ25hbFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRBbmRTaWduYWwocmFuZ2UsIGNsZWFyTGFzdCkge1xuICAgICAgdGhpcy5zZXQocmFuZ2UsIGNsZWFyTGFzdCk7XG4gICAgICAvLyA6OiAoKSAjcGF0aD1Qcm9zZU1pcnJvciNldmVudHMjc2VsZWN0aW9uQ2hhbmdlXG4gICAgICAvLyBJbmRpY2F0ZXMgdGhhdCB0aGUgZWRpdG9yJ3Mgc2VsZWN0aW9uIGhhcyBjaGFuZ2VkLlxuICAgICAgdGhpcy5wbS5zaWduYWwoXCJzZWxlY3Rpb25DaGFuZ2VcIik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXQocmFuZ2UsIGNsZWFyTGFzdCkge1xuICAgICAgdGhpcy5yYW5nZSA9IHJhbmdlO1xuICAgICAgaWYgKCFyYW5nZS5ub2RlKSB0aGlzLmxhc3ROb25Ob2RlUG9zID0gbnVsbDtcbiAgICAgIGlmIChjbGVhckxhc3QgIT09IGZhbHNlKSB0aGlzLmxhc3RBbmNob3JOb2RlID0gbnVsbDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicG9sbEZvclVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwb2xsRm9yVXBkYXRlKCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLnBtLmlucHV0LmNvbXBvc2luZykgcmV0dXJuO1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucG9sbFRpbWVvdXQpO1xuICAgICAgdGhpcy5wb2xsU3RhdGUgPSBcInVwZGF0ZVwiO1xuICAgICAgdmFyIG4gPSAwLFxuICAgICAgICAgIGNoZWNrID0gZnVuY3Rpb24gY2hlY2soKSB7XG4gICAgICAgIGlmIChfdGhpczIucG0uaW5wdXQuY29tcG9zaW5nKSB7XG4gICAgICAgICAgLy8gQWJvcnRcbiAgICAgICAgfSBlbHNlIGlmIChfdGhpczIucG0ub3BlcmF0aW9uKSB7XG4gICAgICAgICAgICBfdGhpczIucG9sbFRpbWVvdXQgPSBzZXRUaW1lb3V0KGNoZWNrLCAyMCk7XG4gICAgICAgICAgfSBlbHNlIGlmICghX3RoaXMyLnJlYWRVcGRhdGUoKSAmJiArK24gPT0gMSkge1xuICAgICAgICAgICAgX3RoaXMyLnBvbGxUaW1lb3V0ID0gc2V0VGltZW91dChjaGVjaywgNTApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfdGhpczIuc3RvcFBvbGxpbmdGb3JVcGRhdGUoKTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdGhpcy5wb2xsVGltZW91dCA9IHNldFRpbWVvdXQoY2hlY2ssIDIwKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic3RvcFBvbGxpbmdGb3JVcGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3RvcFBvbGxpbmdGb3JVcGRhdGUoKSB7XG4gICAgICBpZiAodGhpcy5wb2xsU3RhdGUgPT0gXCJ1cGRhdGVcIikge1xuICAgICAgICB0aGlzLnBvbGxTdGF0ZSA9IG51bGw7XG4gICAgICAgIHRoaXMucG9sbFRvU3luYygpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkb21DaGFuZ2VkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRvbUNoYW5nZWQoKSB7XG4gICAgICB2YXIgc2VsID0gZ2V0U2VsZWN0aW9uKCk7XG4gICAgICByZXR1cm4gc2VsLmFuY2hvck5vZGUgIT0gdGhpcy5sYXN0QW5jaG9yTm9kZSB8fCBzZWwuYW5jaG9yT2Zmc2V0ICE9IHRoaXMubGFzdEFuY2hvck9mZnNldCB8fCBzZWwuZm9jdXNOb2RlICE9IHRoaXMubGFzdEhlYWROb2RlIHx8IHNlbC5mb2N1c09mZnNldCAhPSB0aGlzLmxhc3RIZWFkT2Zmc2V0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzdG9yZURPTVN0YXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN0b3JlRE9NU3RhdGUoKSB7XG4gICAgICB2YXIgc2VsID0gZ2V0U2VsZWN0aW9uKCk7XG4gICAgICB0aGlzLmxhc3RBbmNob3JOb2RlID0gc2VsLmFuY2hvck5vZGU7dGhpcy5sYXN0QW5jaG9yT2Zmc2V0ID0gc2VsLmFuY2hvck9mZnNldDtcbiAgICAgIHRoaXMubGFzdEhlYWROb2RlID0gc2VsLmZvY3VzTm9kZTt0aGlzLmxhc3RIZWFkT2Zmc2V0ID0gc2VsLmZvY3VzT2Zmc2V0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZWFkVXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlYWRVcGRhdGUoKSB7XG4gICAgICBpZiAodGhpcy5wbS5pbnB1dC5jb21wb3NpbmcgfHwgIWhhc0ZvY3VzKHRoaXMucG0pIHx8ICF0aGlzLmRvbUNoYW5nZWQoKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICB2YXIgc2VsID0gZ2V0U2VsZWN0aW9uKCksXG4gICAgICAgICAgZG9jID0gdGhpcy5wbS5kb2M7XG4gICAgICB2YXIgYW5jaG9yID0gcG9zRnJvbURPTUlubmVyKHRoaXMucG0sIHNlbC5hbmNob3JOb2RlLCBzZWwuYW5jaG9yT2Zmc2V0KTtcbiAgICAgIHZhciBoZWFkID0gcG9zRnJvbURPTUlubmVyKHRoaXMucG0sIHNlbC5mb2N1c05vZGUsIHNlbC5mb2N1c09mZnNldCk7XG4gICAgICB2YXIgbmV3U2VsID0gZmluZFNlbGVjdGlvbk5lYXIoZG9jLCBoZWFkLCB0aGlzLnJhbmdlLmhlYWQgJiYgdGhpcy5yYW5nZS5oZWFkLmNtcChoZWFkKSA8IDAgPyAtMSA6IDEpO1xuICAgICAgaWYgKG5ld1NlbCBpbnN0YW5jZW9mIFRleHRTZWxlY3Rpb24gJiYgZG9jLnBhdGgoYW5jaG9yLnBhdGgpLmlzVGV4dGJsb2NrKSBuZXdTZWwgPSBuZXcgVGV4dFNlbGVjdGlvbihhbmNob3IsIG5ld1NlbC5oZWFkKTtcbiAgICAgIHRoaXMuc2V0QW5kU2lnbmFsKG5ld1NlbCk7XG4gICAgICBpZiAobmV3U2VsIGluc3RhbmNlb2YgTm9kZVNlbGVjdGlvbiB8fCBuZXdTZWwuaGVhZC5jbXAoaGVhZCkgfHwgbmV3U2VsLmFuY2hvci5jbXAoYW5jaG9yKSkge1xuICAgICAgICB0aGlzLnRvRE9NKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNsZWFyTm9kZSgpO1xuICAgICAgICB0aGlzLnN0b3JlRE9NU3RhdGUoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwb2xsVG9TeW5jXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBvbGxUb1N5bmMoKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMucG9sbFN0YXRlKSByZXR1cm47XG4gICAgICB0aGlzLnBvbGxTdGF0ZSA9IFwic3luY1wiO1xuICAgICAgdmFyIHN5bmMgPSBmdW5jdGlvbiBzeW5jKCkge1xuICAgICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPSBfdGhpczMucG0uY29udGVudCkge1xuICAgICAgICAgIF90aGlzMy5wb2xsU3RhdGUgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICghX3RoaXMzLnBtLm9wZXJhdGlvbiAmJiAhX3RoaXMzLnBtLmlucHV0LmNvbXBvc2luZykgX3RoaXMzLnN5bmNET00oKTtcbiAgICAgICAgICBfdGhpczMucG9sbFRpbWVvdXQgPSBzZXRUaW1lb3V0KHN5bmMsIDIwMCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB0aGlzLnBvbGxUaW1lb3V0ID0gc2V0VGltZW91dChzeW5jLCAyMDApO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzeW5jRE9NXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN5bmNET00oKSB7XG4gICAgICBpZiAoIXRoaXMucG0uaW5wdXQuY29tcG9zaW5nICYmIGhhc0ZvY3VzKHRoaXMucG0pICYmIHRoaXMuZG9tQ2hhbmdlZCgpKSB0aGlzLnRvRE9NKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRvRE9NXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvRE9NKHRha2VGb2N1cykge1xuICAgICAgaWYgKHRoaXMucmFuZ2UgaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uKSB0aGlzLm5vZGVUb0RPTSh0YWtlRm9jdXMpO2Vsc2UgdGhpcy5yYW5nZVRvRE9NKHRha2VGb2N1cyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm5vZGVUb0RPTVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBub2RlVG9ET00odGFrZUZvY3VzKSB7XG4gICAgICB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICBpZiAodGFrZUZvY3VzKSB0aGlzLnBtLmNvbnRlbnQuZm9jdXMoKTtcbiAgICAgIHZhciBwb3MgPSB0aGlzLnJhbmdlLmZyb20sXG4gICAgICAgICAgbm9kZSA9IHRoaXMucmFuZ2Uubm9kZTtcbiAgICAgIHZhciBkb20gPSByZXNvbHZlUGF0aCh0aGlzLnBtLmNvbnRlbnQsIHBvcy50b1BhdGgoKSk7XG4gICAgICBpZiAoZG9tID09IHRoaXMubGFzdE5vZGUpIHJldHVybjtcbiAgICAgIHRoaXMuY2xlYXJOb2RlKCk7XG4gICAgICBhZGROb2RlU2VsZWN0aW9uKG5vZGUsIGRvbSk7XG4gICAgICB0aGlzLmxhc3ROb2RlID0gZG9tO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjbGVhck5vZGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2xlYXJOb2RlKCkge1xuICAgICAgaWYgKHRoaXMubGFzdE5vZGUpIHtcbiAgICAgICAgY2xlYXJOb2RlU2VsZWN0aW9uKHRoaXMubGFzdE5vZGUpO1xuICAgICAgICB0aGlzLmxhc3ROb2RlID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJhbmdlVG9ET01cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmFuZ2VUb0RPTSh0YWtlRm9jdXMpIHtcbiAgICAgIHZhciBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICBpZiAoIXRoaXMuY2xlYXJOb2RlKCkgJiYgIWhhc0ZvY3VzKHRoaXMucG0pKSB7XG4gICAgICAgIGlmICghdGFrZUZvY3VzKSByZXR1cm47XG4gICAgICAgIC8vIFNlZSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD05MjE0NDRcbiAgICAgICAgZWxzZSBpZiAoX2RvbS5icm93c2VyLmdlY2tvKSB0aGlzLnBtLmNvbnRlbnQuZm9jdXMoKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5kb21DaGFuZ2VkKCkpIHJldHVybjtcblxuICAgICAgdmFyIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAgIHZhciBjb250ZW50ID0gdGhpcy5wbS5jb250ZW50O1xuICAgICAgdmFyIGFuY2hvciA9IERPTUZyb21Qb3MoY29udGVudCwgdGhpcy5yYW5nZS5hbmNob3IpO1xuICAgICAgdmFyIGhlYWQgPSBET01Gcm9tUG9zKGNvbnRlbnQsIHRoaXMucmFuZ2UuaGVhZCk7XG5cbiAgICAgIGlmIChzZWwuZXh0ZW5kKSB7XG4gICAgICAgIHJhbmdlLnNldEVuZChhbmNob3Iubm9kZSwgYW5jaG9yLm9mZnNldCk7XG4gICAgICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLnJhbmdlLmFuY2hvci5jbXAodGhpcy5yYW5nZS5oZWFkKSA+IDApIHtcbiAgICAgICAgICB2YXIgdG1wID0gYW5jaG9yO2FuY2hvciA9IGhlYWQ7aGVhZCA9IHRtcDtcbiAgICAgICAgfVxuICAgICAgICByYW5nZS5zZXRFbmQoaGVhZC5ub2RlLCBoZWFkLm9mZnNldCk7XG4gICAgICAgIHJhbmdlLnNldFN0YXJ0KGFuY2hvci5ub2RlLCBhbmNob3Iub2Zmc2V0KTtcbiAgICAgIH1cbiAgICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgIHNlbC5hZGRSYW5nZShyYW5nZSk7XG4gICAgICBpZiAoc2VsLmV4dGVuZCkgc2VsLmV4dGVuZChoZWFkLm5vZGUsIGhlYWQub2Zmc2V0KTtcbiAgICAgIHRoaXMuc3RvcmVET01TdGF0ZSgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZWNlaXZlZEZvY3VzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlY2VpdmVkRm9jdXMoKSB7XG4gICAgICBpZiAoIXRoaXMucG9sbFN0YXRlKSB0aGlzLnBvbGxUb1N5bmMoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYmVmb3JlU3RhcnRPcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBiZWZvcmVTdGFydE9wKCkge1xuICAgICAgaWYgKHRoaXMucG9sbFN0YXRlID09IFwidXBkYXRlXCIgJiYgdGhpcy5yZWFkVXBkYXRlKCkpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucG9sbFRpbWVvdXQpO1xuICAgICAgICB0aGlzLnN0b3BQb2xsaW5nRm9yVXBkYXRlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN5bmNET00oKTtcbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gU2VsZWN0aW9uU3RhdGU7XG59KSgpO1xuXG5leHBvcnRzLlNlbGVjdGlvblN0YXRlID0gU2VsZWN0aW9uU3RhdGU7XG5cbmZ1bmN0aW9uIGNsZWFyTm9kZVNlbGVjdGlvbihkb20pIHtcbiAgZG9tLmNsYXNzTGlzdC5yZW1vdmUoXCJQcm9zZU1pcnJvci1zZWxlY3RlZG5vZGVcIik7XG59XG5cbmZ1bmN0aW9uIGFkZE5vZGVTZWxlY3Rpb24oX25vZGUsIGRvbSkge1xuICBkb20uY2xhc3NMaXN0LmFkZChcIlByb3NlTWlycm9yLXNlbGVjdGVkbm9kZVwiKTtcbn1cblxuZnVuY3Rpb24gd2luZG93UmVjdCgpIHtcbiAgcmV0dXJuIHsgbGVmdDogMCwgcmlnaHQ6IHdpbmRvdy5pbm5lcldpZHRoLFxuICAgIHRvcDogMCwgYm90dG9tOiB3aW5kb3cuaW5uZXJIZWlnaHQgfTtcbn1cblxuLy8gOzsgQW4gZWRpdG9yIHNlbGVjdGlvbi4gQ2FuIGJlIG9uZSBvZiB0d28gc2VsZWN0aW9uIHR5cGVzOlxuLy8gYFRleHRTZWxlY3Rpb25gIGFuZCBgTm9kZVNlbGVjdGlvbmAuIEJvdGggaGF2ZSB0aGUgcHJvcGVydGllc1xuLy8gbGlzdGVkIGhlcmUsIGJ1dCBhbHNvIGNvbnRhaW4gbW9yZSBpbmZvcm1hdGlvbiAoc3VjaCBhcyB0aGVcbi8vIHNlbGVjdGVkIFtub2RlXSgjTm9kZVNlbGVjdGlvbi5ub2RlKSBvciB0aGVcbi8vIFtoZWFkXSgjVGV4dFNlbGVjdGlvbi5oZWFkKSBhbmQgW2FuY2hvcl0oI1RleHRTZWxlY3Rpb24uYW5jaG9yKSkuXG5cbnZhciBTZWxlY3Rpb24gPSBmdW5jdGlvbiBTZWxlY3Rpb24oKSB7XG4gIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBTZWxlY3Rpb24pO1xufTtcblxuZXhwb3J0cy5TZWxlY3Rpb24gPSBTZWxlY3Rpb247XG5cbi8vIDo6IFBvcyAjcGF0aD1TZWxlY3Rpb24ucHJvdG90eXBlLmZyb21cbi8vIFRoZSBzdGFydCBvZiB0aGUgc2VsZWN0aW9uLlxuXG4vLyA6OiBQb3MgI3BhdGg9U2VsZWN0aW9uLnByb3RvdHlwZS50b1xuLy8gVGhlIGVuZCBvZiB0aGUgc2VsZWN0aW9uLlxuXG4vLyA6OiBib29sICNwYXRoPVNlbGVjdGlvbi5lbXB0eVxuLy8gVHJ1ZSBpZiB0aGUgc2VsZWN0aW9uIGlzIGFuIGVtcHR5IHRleHQgc2VsZWN0aW9uIChoZWFkIGFuIGFuY2hvclxuLy8gYXJlIHRoZSBzYW1lKS5cblxuLy8gOjogKG90aGVyOiBTZWxlY3Rpb24pIOKGkiBib29sICNwYXRoPVNlbGVjdGlvbi5lcVxuLy8gVGVzdCB3aGV0aGVyIHRoZSBzZWxlY3Rpb24gaXMgdGhlIHNhbWUgYXMgYW5vdGhlciBzZWxlY3Rpb24uXG5cbi8vIDo6IChkb2M6IE5vZGUsIG1hcHBpbmc6IE1hcHBhYmxlKSDihpIgU2VsZWN0aW9uICNwYXRoPVNlbGVjdGlvbi5tYXBcbi8vIE1hcCB0aGlzIHNlbGVjdGlvbiB0aHJvdWdoIGEgW21hcHBhYmxlXSgjTWFwcGFibGUpIHRoaW5nLiBgZG9jYFxuLy8gc2hvdWxkIGJlIHRoZSBuZXcgZG9jdW1lbnQsIHRvIHdoaWNoIHdlIGFyZSBtYXBwaW5nLlxuXG4vLyA7OyAjdG9jPWZhbHNlIEEgdGV4dCBzZWxlY3Rpb24gcmVwcmVzZW50cyBhIGNsYXNzaWNhbCBlZGl0b3Jcbi8vIHNlbGVjdGlvbiwgd2l0aCBhIGhlYWQgKHRoZSBtb3Zpbmcgc2lkZSkgYW5kIGFuY2hvciAoaW1tb2JpbGVcbi8vIHNpZGUpLCBib3RoIG9mIHdoaWNoIHBvaW50IGludG8gdGV4dGJsb2NrIG5vZGVzLiBJdCBjYW4gYmUgZW1wdHkgKGFcbi8vIHJlZ3VsYXIgY3Vyc29yIHBvc2l0aW9uKS5cblxudmFyIFRleHRTZWxlY3Rpb24gPSAoZnVuY3Rpb24gKF9TZWxlY3Rpb24pIHtcbiAgX2luaGVyaXRzKFRleHRTZWxlY3Rpb24sIF9TZWxlY3Rpb24pO1xuXG4gIC8vIDo6IChQb3MsID9Qb3MpXG4gIC8vIENvbnN0cnVjdCBhIHRleHQgc2VsZWN0aW9uLiBXaGVuIGBoZWFkYCBpcyBub3QgZ2l2ZW4sIGl0IGRlZmF1bHRzXG4gIC8vIHRvIGBhbmNob3JgLlxuXG4gIGZ1bmN0aW9uIFRleHRTZWxlY3Rpb24oYW5jaG9yLCBoZWFkKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRleHRTZWxlY3Rpb24pO1xuXG4gICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoVGV4dFNlbGVjdGlvbi5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmNhbGwodGhpcyk7XG4gICAgLy8gOjogUG9zXG4gICAgLy8gVGhlIHNlbGVjdGlvbidzIGltbW9iaWxlIHNpZGUgKGRvZXMgbm90IG1vdmUgd2hlbiBwcmVzc2luZ1xuICAgIC8vIHNoaWZ0LWFycm93KS5cbiAgICB0aGlzLmFuY2hvciA9IGFuY2hvcjtcbiAgICAvLyA6OiBQb3NcbiAgICAvLyBUaGUgc2VsZWN0aW9uJ3MgbW9iaWxlIHNpZGUgKHRoZSBzaWRlIHRoYXQgbW92ZXMgd2hlbiBwcmVzc2luZ1xuICAgIC8vIHNoaWZ0LWFycm93KS5cbiAgICB0aGlzLmhlYWQgPSBoZWFkIHx8IGFuY2hvcjtcbiAgfVxuXG4gIC8vIDs7ICN0b2M9ZmFsc2UgQSBub2RlIHNlbGVjdGlvbiBpcyBhIHNlbGVjdGlvbiB0aGF0IHBvaW50cyBhdCBhXG4gIC8vIHNpbmdsZSBub2RlLiBBbGwgbm9kZXMgbWFya2VkIFtzZWxlY3RhYmxlXSgjTm9kZVR5cGUuc2VsZWN0YWJsZSlcbiAgLy8gY2FuIGJlIHRoZSB0YXJnZXQgb2YgYSBub2RlIHNlbGVjdGlvbi4gSW4gc3VjaCBhbiBvYmplY3QsIGBmcm9tYFxuICAvLyBhbmQgYHRvYCBwb2ludCBkaXJlY3RseSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBzZWxlY3RlZCBub2RlLlxuXG4gIF9jcmVhdGVDbGFzcyhUZXh0U2VsZWN0aW9uLCBbe1xuICAgIGtleTogXCJlcVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlcShvdGhlcikge1xuICAgICAgcmV0dXJuIG90aGVyIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbiAmJiAhb3RoZXIuaGVhZC5jbXAodGhpcy5oZWFkKSAmJiAhb3RoZXIuYW5jaG9yLmNtcCh0aGlzLmFuY2hvcik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm1hcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYXAoZG9jLCBtYXBwaW5nKSB7XG4gICAgICB2YXIgaGVhZCA9IG1hcHBpbmcubWFwKHRoaXMuaGVhZCkucG9zO1xuICAgICAgaWYgKCFkb2MucGF0aChoZWFkLnBhdGgpLmlzVGV4dGJsb2NrKSByZXR1cm4gZmluZFNlbGVjdGlvbk5lYXIoZG9jLCBoZWFkKTtcbiAgICAgIHZhciBhbmNob3IgPSBtYXBwaW5nLm1hcCh0aGlzLmFuY2hvcikucG9zO1xuICAgICAgcmV0dXJuIG5ldyBUZXh0U2VsZWN0aW9uKGRvYy5wYXRoKGFuY2hvci5wYXRoKS5pc1RleHRibG9jayA/IGFuY2hvciA6IGhlYWQsIGhlYWQpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbnZlcnRlZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuYW5jaG9yLmNtcCh0aGlzLmhlYWQpID4gMDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZnJvbVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW52ZXJ0ZWQgPyB0aGlzLmhlYWQgOiB0aGlzLmFuY2hvcjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidG9cIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmludmVydGVkID8gdGhpcy5hbmNob3IgOiB0aGlzLmhlYWQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVtcHR5XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5hbmNob3IuY21wKHRoaXMuaGVhZCkgPT0gMDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gVGV4dFNlbGVjdGlvbjtcbn0pKFNlbGVjdGlvbik7XG5cbmV4cG9ydHMuVGV4dFNlbGVjdGlvbiA9IFRleHRTZWxlY3Rpb247XG5cbnZhciBOb2RlU2VsZWN0aW9uID0gKGZ1bmN0aW9uIChfU2VsZWN0aW9uMikge1xuICBfaW5oZXJpdHMoTm9kZVNlbGVjdGlvbiwgX1NlbGVjdGlvbjIpO1xuXG4gIC8vIDo6IChQb3MsIFBvcywgTm9kZSlcbiAgLy8gQ3JlYXRlIGEgbm9kZSBzZWxlY3Rpb24uIERvZXMgbm90IHZlcmlmeSB0aGUgdmFsaWRpdHkgb2YgaXRzXG4gIC8vIGFyZ3VtZW50cy4gVXNlIGBQcm9zZU1pcnJvci5zZXROb2RlU2VsZWN0aW9uYCBmb3IgYW4gZWFzaWVyLFxuICAvLyBlcnJvci1jaGVja2luZyB3YXkgdG8gY3JlYXRlIGEgbm9kZSBzZWxlY3Rpb24uXG5cbiAgZnVuY3Rpb24gTm9kZVNlbGVjdGlvbihmcm9tLCB0bywgbm9kZSkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBOb2RlU2VsZWN0aW9uKTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKE5vZGVTZWxlY3Rpb24ucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5jYWxsKHRoaXMpO1xuICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgdGhpcy50byA9IHRvO1xuICAgIC8vIDo6IE5vZGUgVGhlIHNlbGVjdGVkIG5vZGUuXG4gICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhOb2RlU2VsZWN0aW9uLCBbe1xuICAgIGtleTogXCJlcVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlcShvdGhlcikge1xuICAgICAgcmV0dXJuIG90aGVyIGluc3RhbmNlb2YgTm9kZVNlbGVjdGlvbiAmJiAhdGhpcy5mcm9tLmNtcChvdGhlci5mcm9tKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibWFwXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1hcChkb2MsIG1hcHBpbmcpIHtcbiAgICAgIHZhciBmcm9tID0gbWFwcGluZy5tYXAodGhpcy5mcm9tLCAxKS5wb3M7XG4gICAgICB2YXIgdG8gPSBtYXBwaW5nLm1hcCh0aGlzLnRvLCAtMSkucG9zO1xuICAgICAgaWYgKF9tb2RlbC5Qb3Muc2FtZVBhdGgoZnJvbS5wYXRoLCB0by5wYXRoKSAmJiBmcm9tLm9mZnNldCA9PSB0by5vZmZzZXQgLSAxKSB7XG4gICAgICAgIHZhciBub2RlID0gZG9jLm5vZGVBZnRlcihmcm9tKTtcbiAgICAgICAgaWYgKG5vZGUudHlwZS5zZWxlY3RhYmxlKSByZXR1cm4gbmV3IE5vZGVTZWxlY3Rpb24oZnJvbSwgdG8sIG5vZGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZpbmRTZWxlY3Rpb25OZWFyKGRvYywgZnJvbSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVtcHR5XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIE5vZGVTZWxlY3Rpb247XG59KShTZWxlY3Rpb24pO1xuXG5leHBvcnRzLk5vZGVTZWxlY3Rpb24gPSBOb2RlU2VsZWN0aW9uO1xuXG5mdW5jdGlvbiBwYXRoRnJvbURPTShwbSwgbm9kZSkge1xuICB2YXIgcGF0aCA9IFtdO1xuICBmb3IgKDsgbm9kZSAhPSBwbS5jb250ZW50Oykge1xuICAgIHZhciBhdHRyID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJwbS1vZmZzZXRcIik7XG4gICAgaWYgKGF0dHIpIHBhdGgudW5zaGlmdCgrYXR0cik7XG4gICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgfVxuICByZXR1cm4gcGF0aDtcbn1cblxuZnVuY3Rpb24gd2lkdGhGcm9tRE9NKGRvbSkge1xuICB2YXIgYXR0ciA9IGRvbS5nZXRBdHRyaWJ1dGUoXCJwbS1sZWFmXCIpO1xuICByZXR1cm4gYXR0ciAmJiBhdHRyICE9IFwidHJ1ZVwiID8gK2F0dHIgOiAxO1xufVxuXG5mdW5jdGlvbiBwb3NGcm9tRE9NSW5uZXIocG0sIGRvbSwgZG9tT2Zmc2V0LCBsb29zZSkge1xuICBpZiAoIWxvb3NlICYmIHBtLm9wZXJhdGlvbiAmJiBwbS5kb2MgIT0gcG0ub3BlcmF0aW9uLmRvYykgdGhyb3cgbmV3IEVycm9yKFwiRmV0Y2hpbmcgYSBwb3NpdGlvbiBmcm9tIGFuIG91dGRhdGVkIERPTSBzdHJ1Y3R1cmVcIik7XG5cbiAgdmFyIGV4dHJhT2Zmc2V0ID0gMCxcbiAgICAgIHRhZyA9IHVuZGVmaW5lZDtcbiAgZm9yICg7Oykge1xuICAgIHZhciBhZGp1c3QgPSAwO1xuICAgIGlmIChkb20ubm9kZVR5cGUgPT0gMykge1xuICAgICAgZXh0cmFPZmZzZXQgKz0gZG9tT2Zmc2V0O1xuICAgIH0gZWxzZSBpZiAoZG9tLmhhc0F0dHJpYnV0ZShcInBtLW9mZnNldFwiKSB8fCBkb20gPT0gcG0uY29udGVudCkge1xuICAgICAgYnJlYWs7XG4gICAgfSBlbHNlIGlmICh0YWcgPSBkb20uZ2V0QXR0cmlidXRlKFwicG0taW5uZXItb2Zmc2V0XCIpKSB7XG4gICAgICBleHRyYU9mZnNldCArPSArdGFnO1xuICAgICAgYWRqdXN0ID0gLTE7XG4gICAgfSBlbHNlIGlmIChkb21PZmZzZXQgJiYgZG9tT2Zmc2V0ID09IGRvbS5jaGlsZE5vZGVzLmxlbmd0aCkge1xuICAgICAgYWRqdXN0ID0gMTtcbiAgICB9XG5cbiAgICB2YXIgX3BhcmVudCA9IGRvbS5wYXJlbnROb2RlO1xuICAgIGRvbU9mZnNldCA9IGFkanVzdCA8IDAgPyAwIDogQXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChfcGFyZW50LmNoaWxkTm9kZXMsIGRvbSkgKyBhZGp1c3Q7XG4gICAgZG9tID0gX3BhcmVudDtcbiAgfVxuXG4gIHZhciBwYXRoID0gcGF0aEZyb21ET00ocG0sIGRvbSk7XG4gIGlmIChkb20uaGFzQXR0cmlidXRlKFwicG0tbGVhZlwiKSkgcmV0dXJuIF9tb2RlbC5Qb3MuZnJvbShwYXRoLCBleHRyYU9mZnNldCArIChkb21PZmZzZXQgPyAxIDogMCkpO1xuXG4gIHZhciBvZmZzZXQgPSAwO1xuICBmb3IgKHZhciBpID0gZG9tT2Zmc2V0IC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICB2YXIgY2hpbGQgPSBkb20uY2hpbGROb2Rlc1tpXTtcbiAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT0gMykge1xuICAgICAgaWYgKGxvb3NlKSBleHRyYU9mZnNldCArPSBjaGlsZC5ub2RlVmFsdWUubGVuZ3RoO1xuICAgIH0gZWxzZSBpZiAodGFnID0gY2hpbGQuZ2V0QXR0cmlidXRlKFwicG0tb2Zmc2V0XCIpKSB7XG4gICAgICBvZmZzZXQgPSArdGFnICsgd2lkdGhGcm9tRE9NKGNoaWxkKTtcbiAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSBpZiAobG9vc2UgJiYgIWNoaWxkLmhhc0F0dHJpYnV0ZShcInBtLWlnbm9yZVwiKSkge1xuICAgICAgZXh0cmFPZmZzZXQgKz0gY2hpbGQudGV4dENvbnRlbnQubGVuZ3RoO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmV3IF9tb2RlbC5Qb3MocGF0aCwgb2Zmc2V0ICsgZXh0cmFPZmZzZXQpO1xufVxuXG5mdW5jdGlvbiBwb3NGcm9tRE9NKHBtLCBub2RlLCBvZmZzZXQpIHtcbiAgaWYgKG9mZnNldCA9PSBudWxsKSB7XG4gICAgb2Zmc2V0ID0gQXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChub2RlLnBhcmVudE5vZGUuY2hpbGROb2Rlcywgbm9kZSk7XG4gICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgfVxuICByZXR1cm4gcG9zRnJvbURPTUlubmVyKHBtLCBub2RlLCBvZmZzZXQpO1xufVxuXG5mdW5jdGlvbiByYW5nZUZyb21ET01Mb29zZShwbSkge1xuICBpZiAoIWhhc0ZvY3VzKHBtKSkgcmV0dXJuIG51bGw7XG4gIHZhciBzZWwgPSBnZXRTZWxlY3Rpb24oKTtcbiAgcmV0dXJuIG5ldyBUZXh0U2VsZWN0aW9uKHBvc0Zyb21ET01Jbm5lcihwbSwgc2VsLmFuY2hvck5vZGUsIHNlbC5hbmNob3JPZmZzZXQsIHRydWUpLCBwb3NGcm9tRE9NSW5uZXIocG0sIHNlbC5mb2N1c05vZGUsIHNlbC5mb2N1c09mZnNldCwgdHJ1ZSkpO1xufVxuXG5mdW5jdGlvbiBmaW5kQnlQYXRoKG5vZGUsIG4sIGZyb21FbmQpIHtcbiAgZm9yICh2YXIgY2ggPSBmcm9tRW5kID8gbm9kZS5sYXN0Q2hpbGQgOiBub2RlLmZpcnN0Q2hpbGQ7IGNoOyBjaCA9IGZyb21FbmQgPyBjaC5wcmV2aW91c1NpYmxpbmcgOiBjaC5uZXh0U2libGluZykge1xuICAgIGlmIChjaC5ub2RlVHlwZSAhPSAxKSBjb250aW51ZTtcbiAgICB2YXIgb2Zmc2V0ID0gY2guZ2V0QXR0cmlidXRlKFwicG0tb2Zmc2V0XCIpO1xuICAgIGlmICghb2Zmc2V0KSB7XG4gICAgICB2YXIgZm91bmQgPSBmaW5kQnlQYXRoKGNoLCBuKTtcbiAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGZvdW5kO1xuICAgIH0gZWxzZSBpZiAoK29mZnNldCA9PSBuKSB7XG4gICAgICByZXR1cm4gY2g7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVQYXRoKHBhcmVudCwgcGF0aCkge1xuICB2YXIgbm9kZSA9IHBhcmVudDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgbm9kZSA9IGZpbmRCeVBhdGgobm9kZSwgcGF0aFtpXSk7XG4gICAgaWYgKCFub2RlKSB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gcmVzb2x2ZSBwYXRoIFwiICsgcGF0aC5qb2luKFwiL1wiKSk7XG4gIH1cbiAgcmV0dXJuIG5vZGU7XG59XG5cbmZ1bmN0aW9uIGZpbmRCeU9mZnNldChub2RlLCBvZmZzZXQsIGFmdGVyKSB7XG4gIGZ1bmN0aW9uIHNlYXJjaChub2RlKSB7XG4gICAgZm9yICh2YXIgY2ggPSBub2RlLmZpcnN0Q2hpbGQsIGkgPSAwLCBhdHRyID0gdW5kZWZpbmVkOyBjaDsgY2ggPSBjaC5uZXh0U2libGluZywgaSsrKSB7XG4gICAgICBpZiAoY2gubm9kZVR5cGUgIT0gMSkgY29udGludWU7XG4gICAgICBpZiAoYXR0ciA9IGNoLmdldEF0dHJpYnV0ZShcInBtLW9mZnNldFwiKSkge1xuICAgICAgICB2YXIgZGlmZiA9IG9mZnNldCAtICthdHRyLFxuICAgICAgICAgICAgd2lkdGggPSB3aWR0aEZyb21ET00oY2gpO1xuICAgICAgICBpZiAoZGlmZiA+PSAwICYmIChhZnRlciA/IGRpZmYgPD0gd2lkdGggOiBkaWZmIDwgd2lkdGgpKSByZXR1cm4geyBub2RlOiBjaCwgb2Zmc2V0OiBpLCBpbm5lck9mZnNldDogZGlmZiB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHNlYXJjaChjaCk7XG4gICAgICAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBzZWFyY2gobm9kZSk7XG59XG5cbmZ1bmN0aW9uIGxlYWZBdChub2RlLCBvZmZzZXQpIHtcbiAgZm9yICg7Oykge1xuICAgIHZhciBjaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDtcbiAgICBpZiAoIWNoaWxkKSByZXR1cm4geyBub2RlOiBub2RlLCBvZmZzZXQ6IG9mZnNldCB9O1xuICAgIGlmIChjaGlsZC5ub2RlVHlwZSAhPSAxKSByZXR1cm4geyBub2RlOiBjaGlsZCwgb2Zmc2V0OiBvZmZzZXQgfTtcbiAgICBpZiAoY2hpbGQuaGFzQXR0cmlidXRlKFwicG0taW5uZXItb2Zmc2V0XCIpKSB7XG4gICAgICB2YXIgbm9kZU9mZnNldCA9IDA7XG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIHZhciBuZXh0U2liID0gY2hpbGQubmV4dFNpYmxpbmcsXG4gICAgICAgICAgICBuZXh0T2Zmc2V0ID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoIW5leHRTaWIgfHwgKG5leHRPZmZzZXQgPSArbmV4dFNpYi5nZXRBdHRyaWJ1dGUoXCJwbS1pbm5lci1vZmZzZXRcIikpID49IG9mZnNldCkgYnJlYWs7XG4gICAgICAgIGNoaWxkID0gbmV4dFNpYjtcbiAgICAgICAgbm9kZU9mZnNldCA9IG5leHRPZmZzZXQ7XG4gICAgICB9XG4gICAgICBvZmZzZXQgLT0gbm9kZU9mZnNldDtcbiAgICB9XG4gICAgbm9kZSA9IGNoaWxkO1xuICB9XG59XG5cbi8qKlxuICogR2V0IGEgRE9NIGVsZW1lbnQgYXQgYSBnaXZlbiBwb3NpdGlvbiBpbiB0aGUgZG9jdW1lbnQuXG4gKlxuICogQHBhcmFtIHtOb2RlfSBwYXJlbnQgVGhlIHBhcmVudCBET00gbm9kZS5cbiAqIEBwYXJhbSB7UG9zfSBwb3MgICAgIFRoZSBwb3NpdGlvbiBpbiB0aGUgZG9jdW1lbnQuXG4gKiBAcmV0dXJuIHtPYmplY3R9ICAgICBUaGUgRE9NIG5vZGUgYW5kIGNoYXJhY3RlciBvZmZzZXQgaW5zaWRlIHRoZSBub2RlLlxuICovXG5mdW5jdGlvbiBET01Gcm9tUG9zKHBhcmVudCwgcG9zKSB7XG4gIHZhciBkb20gPSByZXNvbHZlUGF0aChwYXJlbnQsIHBvcy5wYXRoKTtcbiAgdmFyIGZvdW5kID0gZmluZEJ5T2Zmc2V0KGRvbSwgcG9zLm9mZnNldCwgdHJ1ZSksXG4gICAgICBpbm5lciA9IHVuZGVmaW5lZDtcbiAgaWYgKCFmb3VuZCkgcmV0dXJuIHsgbm9kZTogZG9tLCBvZmZzZXQ6IDAgfTtcbiAgaWYgKGZvdW5kLm5vZGUuZ2V0QXR0cmlidXRlKFwicG0tbGVhZlwiKSA9PSBcInRydWVcIiB8fCAhKGlubmVyID0gbGVhZkF0KGZvdW5kLm5vZGUsIGZvdW5kLmlubmVyT2Zmc2V0KSkpIHJldHVybiB7IG5vZGU6IGZvdW5kLm5vZGUucGFyZW50Tm9kZSwgb2Zmc2V0OiBmb3VuZC5vZmZzZXQgKyAoZm91bmQuaW5uZXJPZmZzZXQgPyAxIDogMCkgfTtlbHNlIHJldHVybiBpbm5lcjtcbn1cblxuZnVuY3Rpb24gaGFzRm9jdXMocG0pIHtcbiAgdmFyIHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgcmV0dXJuIHNlbC5yYW5nZUNvdW50ICYmICgwLCBfZG9tLmNvbnRhaW5zKShwbS5jb250ZW50LCBzZWwuYW5jaG9yTm9kZSk7XG59XG5cbi8qKlxuICogR2l2ZW4gYW4geCx5IHBvc2l0aW9uIG9uIHRoZSBlZGl0b3IsIGdldCB0aGUgcG9zaXRpb24gaW4gdGhlIGRvY3VtZW50LlxuICpcbiAqIEBwYXJhbSAge1Byb3NlTWlycm9yfSBwbSAgICAgRWRpdG9yIGluc3RhbmNlLlxuICogQHBhcmFtICB7T2JqZWN0fSAgICAgIGNvb3JkcyBUaGUgeCwgeSBjb29yZGluYXRlcy5cbiAqIEByZXR1cm4ge1Bvc31cbiAqL1xuLy8gRklYTUUgZmFpbHMgb24gdGhlIHNwYWNlIGJldHdlZW4gbGluZXNcbi8vIEZJWE1FIHJlZm9ybXVsYXRlIGFzIHNlbGVjdGlvbkF0Q29vcmRzPyBTbyB0aGF0IGl0IGNhbid0IHJldHVybiBudWxsXG5cbmZ1bmN0aW9uIHBvc0F0Q29vcmRzKHBtLCBjb29yZHMpIHtcbiAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KGNvb3Jkcy5sZWZ0LCBjb29yZHMudG9wICsgMSk7XG4gIGlmICghKDAsIF9kb20uY29udGFpbnMpKHBtLmNvbnRlbnQsIGVsZW1lbnQpKSByZXR1cm4gbnVsbDtcblxuICB2YXIgb2Zmc2V0ID0gdW5kZWZpbmVkO1xuICBpZiAoZWxlbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PSAxICYmIGVsZW1lbnQuZmlyc3RDaGlsZC5ub2RlVHlwZSA9PSAzKSB7XG4gICAgZWxlbWVudCA9IGVsZW1lbnQuZmlyc3RDaGlsZDtcbiAgICBvZmZzZXQgPSBvZmZzZXRJblRleHROb2RlKGVsZW1lbnQsIGNvb3Jkcyk7XG4gIH0gZWxzZSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0SW5FbGVtZW50KGVsZW1lbnQsIGNvb3Jkcyk7XG4gIH1cblxuICByZXR1cm4gcG9zRnJvbURPTShwbSwgZWxlbWVudCwgb2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gdGV4dFJlY3Qobm9kZSwgZnJvbSwgdG8pIHtcbiAgdmFyIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgcmFuZ2Uuc2V0RW5kKG5vZGUsIHRvKTtcbiAgcmFuZ2Uuc2V0U3RhcnQobm9kZSwgZnJvbSk7XG4gIHJldHVybiByYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbn1cblxuLyoqXG4gKiBHaXZlbiBhIHBvc2l0aW9uIGluIHRoZSBkb2N1bWVudCBtb2RlbCwgZ2V0IGEgYm91bmRpbmcgYm94IG9mIHRoZSBjaGFyYWN0ZXIgYXRcbiAqIHRoYXQgcG9zaXRpb24sIHJlbGF0aXZlIHRvIHRoZSB3aW5kb3cuXG4gKlxuICogQHBhcmFtICB7UHJvc2VNaXJyb3J9IHBtIFRoZSBlZGl0b3IgaW5zdGFuY2UuXG4gKiBAcGFyYW0gIHtQb3N9ICAgICAgICAgcG9zXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBib3VuZGluZyBib3guXG4gKi9cblxuZnVuY3Rpb24gY29vcmRzQXRQb3MocG0sIHBvcykge1xuICB2YXIgX0RPTUZyb21Qb3MgPSBET01Gcm9tUG9zKHBtLmNvbnRlbnQsIHBvcyk7XG5cbiAgdmFyIG5vZGUgPSBfRE9NRnJvbVBvcy5ub2RlO1xuICB2YXIgb2Zmc2V0ID0gX0RPTUZyb21Qb3Mub2Zmc2V0O1xuXG4gIHZhciBzaWRlID0gdW5kZWZpbmVkLFxuICAgICAgcmVjdCA9IHVuZGVmaW5lZDtcbiAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMykge1xuICAgIGlmIChvZmZzZXQgPCBub2RlLm5vZGVWYWx1ZS5sZW5ndGgpIHtcbiAgICAgIHJlY3QgPSB0ZXh0UmVjdChub2RlLCBvZmZzZXQsIG9mZnNldCArIDEpO1xuICAgICAgc2lkZSA9IFwibGVmdFwiO1xuICAgIH1cbiAgICBpZiAoKCFyZWN0IHx8IHJlY3QubGVmdCA9PSByZWN0LnJpZ2h0KSAmJiBvZmZzZXQpIHtcbiAgICAgIHJlY3QgPSB0ZXh0UmVjdChub2RlLCBvZmZzZXQgLSAxLCBvZmZzZXQpO1xuICAgICAgc2lkZSA9IFwicmlnaHRcIjtcbiAgICB9XG4gIH0gZWxzZSBpZiAobm9kZS5maXJzdENoaWxkKSB7XG4gICAgaWYgKG9mZnNldCA8IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGgpIHtcbiAgICAgIHZhciBjaGlsZCA9IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXRdO1xuICAgICAgcmVjdCA9IGNoaWxkLm5vZGVUeXBlID09IDMgPyB0ZXh0UmVjdChjaGlsZCwgMCwgY2hpbGQubm9kZVZhbHVlLmxlbmd0aCkgOiBjaGlsZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHNpZGUgPSBcImxlZnRcIjtcbiAgICB9XG4gICAgaWYgKCghcmVjdCB8fCByZWN0LmxlZnQgPT0gcmVjdC5yaWdodCkgJiYgb2Zmc2V0KSB7XG4gICAgICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0IC0gMV07XG4gICAgICByZWN0ID0gY2hpbGQubm9kZVR5cGUgPT0gMyA/IHRleHRSZWN0KGNoaWxkLCAwLCBjaGlsZC5ub2RlVmFsdWUubGVuZ3RoKSA6IGNoaWxkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgc2lkZSA9IFwicmlnaHRcIjtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmVjdCA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgc2lkZSA9IFwibGVmdFwiO1xuICB9XG4gIHZhciB4ID0gcmVjdFtzaWRlXTtcbiAgcmV0dXJuIHsgdG9wOiByZWN0LnRvcCwgYm90dG9tOiByZWN0LmJvdHRvbSwgbGVmdDogeCwgcmlnaHQ6IHggfTtcbn1cblxudmFyIHNjcm9sbE1hcmdpbiA9IDU7XG5cbmZ1bmN0aW9uIHNjcm9sbEludG9WaWV3KHBtLCBwb3MpIHtcbiAgaWYgKCFwb3MpIHBvcyA9IHBtLnNlbC5yYW5nZS5oZWFkIHx8IHBtLnNlbC5yYW5nZS5mcm9tO1xuICB2YXIgY29vcmRzID0gY29vcmRzQXRQb3MocG0sIHBvcyk7XG4gIGZvciAodmFyIF9wYXJlbnQyID0gcG0uY29udGVudDs7IF9wYXJlbnQyID0gX3BhcmVudDIucGFyZW50Tm9kZSkge1xuICAgIHZhciBhdEJvZHkgPSBfcGFyZW50MiA9PSBkb2N1bWVudC5ib2R5O1xuICAgIHZhciByZWN0ID0gYXRCb2R5ID8gd2luZG93UmVjdCgpIDogX3BhcmVudDIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdmFyIG1vdmVYID0gMCxcbiAgICAgICAgbW92ZVkgPSAwO1xuICAgIGlmIChjb29yZHMudG9wIDwgcmVjdC50b3ApIG1vdmVZID0gLShyZWN0LnRvcCAtIGNvb3Jkcy50b3AgKyBzY3JvbGxNYXJnaW4pO2Vsc2UgaWYgKGNvb3Jkcy5ib3R0b20gPiByZWN0LmJvdHRvbSkgbW92ZVkgPSBjb29yZHMuYm90dG9tIC0gcmVjdC5ib3R0b20gKyBzY3JvbGxNYXJnaW47XG4gICAgaWYgKGNvb3Jkcy5sZWZ0IDwgcmVjdC5sZWZ0KSBtb3ZlWCA9IC0ocmVjdC5sZWZ0IC0gY29vcmRzLmxlZnQgKyBzY3JvbGxNYXJnaW4pO2Vsc2UgaWYgKGNvb3Jkcy5yaWdodCA+IHJlY3QucmlnaHQpIG1vdmVYID0gY29vcmRzLnJpZ2h0IC0gcmVjdC5yaWdodCArIHNjcm9sbE1hcmdpbjtcbiAgICBpZiAobW92ZVggfHwgbW92ZVkpIHtcbiAgICAgIGlmIChhdEJvZHkpIHdpbmRvdy5zY3JvbGxCeShtb3ZlWCwgbW92ZVkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobW92ZVkpIF9wYXJlbnQyLnNjcm9sbFRvcCArPSBtb3ZlWTtcbiAgICAgIGlmIChtb3ZlWCkgX3BhcmVudDIuc2Nyb2xsTGVmdCArPSBtb3ZlWDtcbiAgICB9XG4gICAgaWYgKGF0Qm9keSkgYnJlYWs7XG4gIH1cbn1cblxuZnVuY3Rpb24gb2Zmc2V0SW5SZWN0cyhjb29yZHMsIHJlY3RzLCBzdHJpY3QpIHtcbiAgdmFyIHkgPSBjb29yZHMudG9wO1xuICB2YXIgeCA9IGNvb3Jkcy5sZWZ0O1xuXG4gIHZhciBtaW5ZID0gMWU4LFxuICAgICAgbWluWCA9IDFlOCxcbiAgICAgIG9mZnNldCA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcmVjdCA9IHJlY3RzW2ldO1xuICAgIGlmICghcmVjdCB8fCByZWN0LnRvcCA9PSByZWN0LmJvdHRvbSkgY29udGludWU7XG4gICAgdmFyIGRYID0geCA8IHJlY3QubGVmdCA/IHJlY3QubGVmdCAtIHggOiB4ID4gcmVjdC5yaWdodCA/IHggLSByZWN0LnJpZ2h0IDogMDtcbiAgICBpZiAoZFggPiBtaW5YKSBjb250aW51ZTtcbiAgICBpZiAoZFggPCBtaW5YKSB7XG4gICAgICBtaW5YID0gZFg7bWluWSA9IDFlODtcbiAgICB9XG4gICAgdmFyIGRZID0geSA8IHJlY3QudG9wID8gcmVjdC50b3AgLSB5IDogeSA+IHJlY3QuYm90dG9tID8geSAtIHJlY3QuYm90dG9tIDogMDtcbiAgICBpZiAoZFkgPCBtaW5ZKSB7XG4gICAgICBtaW5ZID0gZFk7XG4gICAgICBvZmZzZXQgPSB4IDwgKHJlY3QubGVmdCArIHJlY3QucmlnaHQpIC8gMiA/IGkgOiBpICsgMTtcbiAgICB9XG4gIH1cbiAgaWYgKHN0cmljdCAmJiAobWluWCB8fCBtaW5ZKSkgcmV0dXJuIG51bGw7XG4gIHJldHVybiBvZmZzZXQ7XG59XG5cbmZ1bmN0aW9uIG9mZnNldEluVGV4dE5vZGUodGV4dCwgY29vcmRzLCBzdHJpY3QpIHtcbiAgdmFyIGxlbiA9IHRleHQubm9kZVZhbHVlLmxlbmd0aDtcbiAgdmFyIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgdmFyIHJlY3RzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICByYW5nZS5zZXRFbmQodGV4dCwgaSArIDEpO1xuICAgIHJhbmdlLnNldFN0YXJ0KHRleHQsIGkpO1xuICAgIHJlY3RzLnB1c2gocmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpO1xuICB9XG4gIHJldHVybiBvZmZzZXRJblJlY3RzKGNvb3JkcywgcmVjdHMsIHN0cmljdCk7XG59XG5cbmZ1bmN0aW9uIG9mZnNldEluRWxlbWVudChlbGVtZW50LCBjb29yZHMpIHtcbiAgdmFyIHJlY3RzID0gW107XG4gIGZvciAodmFyIGNoaWxkID0gZWxlbWVudC5maXJzdENoaWxkOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZykge1xuICAgIGlmIChjaGlsZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QpIHJlY3RzLnB1c2goY2hpbGQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpO2Vsc2UgcmVjdHMucHVzaChudWxsKTtcbiAgfVxuICByZXR1cm4gb2Zmc2V0SW5SZWN0cyhjb29yZHMsIHJlY3RzKTtcbn1cblxuZnVuY3Rpb24gZmluZFNlbGVjdGlvbkluKGRvYywgcGF0aCwgb2Zmc2V0LCBkaXIsIHRleHQpIHtcbiAgdmFyIG5vZGUgPSBkb2MucGF0aChwYXRoKTtcbiAgaWYgKG5vZGUuaXNUZXh0YmxvY2spIHJldHVybiBuZXcgVGV4dFNlbGVjdGlvbihuZXcgX21vZGVsLlBvcyhwYXRoLCBvZmZzZXQpKTtcblxuICBmb3IgKHZhciBpID0gb2Zmc2V0ICsgKGRpciA+IDAgPyAwIDogLTEpOyBkaXIgPiAwID8gaSA8IG5vZGUuc2l6ZSA6IGkgPj0gMDsgaSArPSBkaXIpIHtcbiAgICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkKGkpO1xuICAgIGlmICghdGV4dCAmJiBjaGlsZC50eXBlLmNvbnRhaW5zID09IG51bGwgJiYgY2hpbGQudHlwZS5zZWxlY3RhYmxlKSByZXR1cm4gbmV3IE5vZGVTZWxlY3Rpb24obmV3IF9tb2RlbC5Qb3MocGF0aCwgaSksIG5ldyBfbW9kZWwuUG9zKHBhdGgsIGkgKyAxKSwgY2hpbGQpO1xuICAgIHBhdGgucHVzaChpKTtcbiAgICB2YXIgaW5zaWRlID0gZmluZFNlbGVjdGlvbkluKGRvYywgcGF0aCwgZGlyIDwgMCA/IGNoaWxkLnNpemUgOiAwLCBkaXIsIHRleHQpO1xuICAgIGlmIChpbnNpZGUpIHJldHVybiBpbnNpZGU7XG4gICAgcGF0aC5wb3AoKTtcbiAgfVxufVxuXG4vLyBGSVhNRSB3ZSdsbCBuZWVkIHNvbWUgYXdhcmVuZXNzIG9mIGJpZGkgbW90aW9uIHdoZW4gZGV0ZXJtaW5pbmcgYmxvY2sgc3RhcnQgYW5kIGVuZFxuXG5mdW5jdGlvbiBmaW5kU2VsZWN0aW9uRnJvbShkb2MsIHBvcywgZGlyLCB0ZXh0KSB7XG4gIGZvciAodmFyIHBhdGggPSBwb3MucGF0aC5zbGljZSgpLCBvZmZzZXQgPSBwb3Mub2Zmc2V0OzspIHtcbiAgICB2YXIgZm91bmQgPSBmaW5kU2VsZWN0aW9uSW4oZG9jLCBwYXRoLCBvZmZzZXQsIGRpciwgdGV4dCk7XG4gICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgaWYgKCFwYXRoLmxlbmd0aCkgYnJlYWs7XG4gICAgb2Zmc2V0ID0gcGF0aC5wb3AoKSArIChkaXIgPiAwID8gMSA6IDApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRTZWxlY3Rpb25OZWFyKGRvYywgcG9zLCBiaWFzLCB0ZXh0KSB7XG4gIGlmIChiaWFzID09PSB1bmRlZmluZWQpIGJpYXMgPSAxO1xuXG4gIHZhciByZXN1bHQgPSBmaW5kU2VsZWN0aW9uRnJvbShkb2MsIHBvcywgYmlhcywgdGV4dCkgfHwgZmluZFNlbGVjdGlvbkZyb20oZG9jLCBwb3MsIC1iaWFzLCB0ZXh0KTtcbiAgaWYgKCFyZXN1bHQpIHRocm93IG5ldyBFcnJvcihcIlNlYXJjaGluZyBmb3Igc2VsZWN0aW9uIGluIGludmFsaWQgZG9jdW1lbnQgXCIgKyBkb2MpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBmaW5kU2VsZWN0aW9uQXRTdGFydChub2RlLCBwYXRoLCB0ZXh0KSB7XG4gIGlmIChwYXRoID09PSB1bmRlZmluZWQpIHBhdGggPSBbXTtcblxuICByZXR1cm4gZmluZFNlbGVjdGlvbkluKG5vZGUsIHBhdGguc2xpY2UoKSwgMCwgMSwgdGV4dCk7XG59XG5cbmZ1bmN0aW9uIGZpbmRTZWxlY3Rpb25BdEVuZChub2RlLCBwYXRoLCB0ZXh0KSB7XG4gIGlmIChwYXRoID09PSB1bmRlZmluZWQpIHBhdGggPSBbXTtcblxuICByZXR1cm4gZmluZFNlbGVjdGlvbkluKG5vZGUsIHBhdGguc2xpY2UoKSwgbm9kZS5zaXplLCAtMSwgdGV4dCk7XG59XG5cbi8vIDs7ICNwYXRoPU5vZGVUeXBlICNraW5kPWNsYXNzICNub0FuY2hvclxuLy8gWW91IGNhbiBhZGQgc2V2ZXJhbCBwcm9wZXJ0aWVzIHRvIFtub2RlIHR5cGVzXSgjTm9kZVR5cGUpIHRvXG4vLyBpbmZsdWVuY2UgdGhlIHdheSB0aGUgZWRpdG9yIGludGVyYWN0cyB3aXRoIHRoZW0uXG5cbi8vIDo6IChub2RlOiBOb2RlLCBwYXRoOiBbbnVtYmVyXSwgZG9tOiBET01Ob2RlLCBjb29yZHM6IHtsZWZ0OiBudW1iZXIsIHRvcDogbnVtYmVyfSkg4oaSID9Qb3Ncbi8vICNwYXRoPU5vZGVUeXBlLnByb3RvdHlwZS5jb3VudENvb3Jkc0FzQ2hpbGRcbi8vIFNwZWNpZmllcyB0aGF0LCBpZiB0aGlzIG5vZGUgaXMgY2xpY2tlZCwgYSBjaGlsZCBub2RlIG1pZ2h0XG4vLyBhY3R1YWxseSBiZSBtZWFudC4gVGhpcyBpcyB1c2VkIHRvLCBmb3IgZXhhbXBsZSwgbWFrZSBjbGlja2luZyBhXG4vLyBsaXN0IG1hcmtlciAod2hpY2gsIGluIHRoZSBET00sIGlzIHBhcnQgb2YgdGhlIGxpc3Qgbm9kZSkgc2VsZWN0XG4vLyB0aGUgbGlzdCBpdGVtIGl0IGJlbG9uZ3MgdG8uIFNob3VsZCByZXR1cm4gbnVsbCBpZiB0aGUgZ2l2ZW5cbi8vIGNvb3JkaW5hdGVzIGRvbid0IHJlZmVyIHRvIGEgY2hpbGQgbm9kZSwgb3IgdGhlIFtwb3NpdGlvbl0oI1Bvcylcbi8vIGJlZm9yZSB0aGVjaGlsZCBvdGhlcndpc2UuXG5cbmZ1bmN0aW9uIHNlbGVjdGFibGVOb2RlQWJvdmUocG0sIGRvbSwgY29vcmRzLCBsaWJlcmFsKSB7XG4gIGZvciAoOyBkb20gJiYgZG9tICE9IHBtLmNvbnRlbnQ7IGRvbSA9IGRvbS5wYXJlbnROb2RlKSB7XG4gICAgaWYgKGRvbS5oYXNBdHRyaWJ1dGUoXCJwbS1vZmZzZXRcIikpIHtcbiAgICAgIHZhciBwYXRoID0gcGF0aEZyb21ET00ocG0sIGRvbSksXG4gICAgICAgICAgbm9kZSA9IHBtLmRvYy5wYXRoKHBhdGgpO1xuICAgICAgaWYgKG5vZGUudHlwZS5jb3VudENvb3Jkc0FzQ2hpbGQpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG5vZGUudHlwZS5jb3VudENvb3Jkc0FzQ2hpbGQobm9kZSwgcGF0aCwgZG9tLCBjb29yZHMpO1xuICAgICAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgLy8gTGVhZiBub2RlcyBhcmUgaW1wbGljaXRseSBjbGlja2FibGVcbiAgICAgIGlmICgobGliZXJhbCB8fCBub2RlLnR5cGUuY29udGFpbnMgPT0gbnVsbCkgJiYgbm9kZS50eXBlLnNlbGVjdGFibGUpIHJldHVybiBfbW9kZWwuUG9zLmZyb20ocGF0aCk7XG4gICAgICBpZiAoIWxpYmVyYWwpIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxufVxuXG4vLyA6OiAocG06IFByb3NlTWlycm9yLCBldmVudDogTW91c2VFdmVudCwgcGF0aDogW251bWJlcl0sIG5vZGU6IE5vZGUpIOKGkiBib29sXG4vLyAjcGF0aD1Ob2RlVHlwZS5wcm90b3R5cGUuaGFuZGxlQ2xpY2tcbi8vIElmIGEgbm9kZSBpcyBkaXJlY3RseSBjbGlja2VkICh0aGF0IGlzLCB0aGUgY2xpY2sgZGlkbid0IGxhbmQgaW4gYVxuLy8gRE9NIG5vZGUgYmVsb25naW5nIHRvIGEgY2hpbGQgbm9kZSksIGFuZCBpdHMgdHlwZSBoYXMgYVxuLy8gYGhhbmRsZUNsaWNrYCBtZXRob2QsIHRoYXQgbWV0aG9kIGlzIGdpdmVuIGEgY2hhbmNlIHRvIGhhbmRsZSB0aGVcbi8vIGNsaWNrLiBUaGUgbWV0aG9kIGlzIGNhbGxlZCwgYW5kIHNob3VsZCByZXR1cm4gYGZhbHNlYCBpZiBpdCBkaWRcbi8vIF9ub3RfIGhhbmRsZSB0aGUgY2xpY2suXG4vL1xuLy8gVGhlIGBldmVudGAgcGFzc2VkIGlzIHRoZSBldmVudCBmb3IgYFwibW91c2Vkb3duXCJgLCBidXQgY2FsbGluZ1xuLy8gYHByZXZlbnREZWZhdWx0YCBvbiBpdCBoYXMgbm8gZWZmZWN0LCBzaW5jZSB0aGlzIG1ldGhvZCBpcyBvbmx5XG4vLyBjYWxsZWQgYWZ0ZXIgYSBjb3JyZXNwb25kaW5nIGBcIm1vdXNldXBcImAgaGFzIG9jY3VycmVkIGFuZFxuLy8gUHJvc2VNaXJyb3IgaGFzIGRldGVybWluZWQgdGhhdCB0aGlzIGlzIG5vdCBhIGRyYWcgb3IgbXVsdGktY2xpY2tcbi8vIGV2ZW50LlxuXG5mdW5jdGlvbiBoYW5kbGVOb2RlQ2xpY2socG0sIGV2ZW50KSB7XG4gIGZvciAodmFyIGRvbSA9IGV2ZW50LnRhcmdldDsgZG9tICYmIGRvbSAhPSBwbS5jb250ZW50OyBkb20gPSBkb20ucGFyZW50Tm9kZSkge1xuICAgIGlmIChkb20uaGFzQXR0cmlidXRlKFwicG0tb2Zmc2V0XCIpKSB7XG4gICAgICB2YXIgcGF0aCA9IHBhdGhGcm9tRE9NKHBtLCBkb20pLFxuICAgICAgICAgIG5vZGUgPSBwbS5kb2MucGF0aChwYXRoKTtcbiAgICAgIHJldHVybiBub2RlLnR5cGUuaGFuZGxlQ2xpY2sgJiYgbm9kZS50eXBlLmhhbmRsZUNsaWNrKHBtLCBldmVudCwgcGF0aCwgbm9kZSkgIT09IGZhbHNlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB2ZXJ0aWNhbE1vdGlvbkxlYXZlc1RleHRibG9jayhwbSwgcG9zLCBkaXIpIHtcbiAgdmFyIGRvbSA9IHJlc29sdmVQYXRoKHBtLmNvbnRlbnQsIHBvcy5wYXRoKTtcbiAgdmFyIGNvb3JkcyA9IGNvb3Jkc0F0UG9zKHBtLCBwb3MpO1xuICBmb3IgKHZhciBjaGlsZCA9IGRvbS5maXJzdENoaWxkOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZykge1xuICAgIGlmIChjaGlsZC5ub2RlVHlwZSAhPSAxKSBjb250aW51ZTtcbiAgICB2YXIgYm94ZXMgPSBjaGlsZC5nZXRDbGllbnRSZWN0cygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm94ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBib3ggPSBib3hlc1tpXTtcbiAgICAgIGlmIChkaXIgPCAwID8gYm94LmJvdHRvbSA8IGNvb3Jkcy50b3AgOiBib3gudG9wID4gY29vcmRzLmJvdHRvbSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gc2V0RE9NU2VsZWN0aW9uVG9Qb3MocG0sIHBvcykge1xuICB2YXIgX0RPTUZyb21Qb3MyID0gRE9NRnJvbVBvcyhwbS5jb250ZW50LCBwb3MpO1xuXG4gIHZhciBub2RlID0gX0RPTUZyb21Qb3MyLm5vZGU7XG4gIHZhciBvZmZzZXQgPSBfRE9NRnJvbVBvczIub2Zmc2V0O1xuXG4gIHZhciByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gIHJhbmdlLnNldEVuZChub2RlLCBvZmZzZXQpO1xuICByYW5nZS5zZXRTdGFydChub2RlLCBvZmZzZXQpO1xuICB2YXIgc2VsID0gZ2V0U2VsZWN0aW9uKCk7XG4gIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgc2VsLmFkZFJhbmdlKHJhbmdlKTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9tb2RlbCA9IHJlcXVpcmUoXCIuLi9tb2RlbFwiKTtcblxudmFyIF9lZGl0ID0gcmVxdWlyZShcIi4uL2VkaXRcIik7XG5cbnZhciBfaW5wdXRydWxlcyA9IHJlcXVpcmUoXCIuL2lucHV0cnVsZXNcIik7XG5cbi8vIDo6IGJvb2wgI3BhdGg9YXV0b0lucHV0ICNraW5kPW9wdGlvblxuLy8gV2hlbiBzZXQgdG8gdHJ1ZSwgZW5hYmxlcyB0aGUgaW5wdXQgcnVsZXMgc3RvcmVkIHVuZGVyIHRoZVxuLy8gYFwiYXV0b0lucHV0XCJgIG5hbWUgaW4gdGhlIGVkaXRvcidzXG4vLyBbYHJlZ2lzdHJ5YF0oI1Byb3NlTWlycm9yLnJlZ2lzdHJ5KeKAlGJ5IGRlZmF1bHQsIHRoZXNlIGFyZSB0aGluZ3Ncbi8vIGxpa2Ugc21hcnQgcXVvdGVzLCBhbmQgYXV0b21hdGljYWxseSB3cmFwcGluZyBhIGJsb2NrIGluIGEgbGlzdCBpZlxuLy8geW91IHN0YXJ0IGl0IHdpdGggYFwiMS4gXCJgLlxuKDAsIF9lZGl0LmRlZmluZU9wdGlvbikoXCJhdXRvSW5wdXRcIiwgZmFsc2UsIGZ1bmN0aW9uIChwbSwgdmFsKSB7XG4gIGlmIChwbS5tb2QuYXV0b0lucHV0KSB7XG4gICAgcG0ubW9kLmF1dG9JbnB1dC5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICByZXR1cm4gKDAsIF9pbnB1dHJ1bGVzLnJlbW92ZUlucHV0UnVsZSkocG0sIG5hbWUpO1xuICAgIH0pO1xuICAgIHBtLm1vZC5hdXRvSW5wdXQgPSBudWxsO1xuICB9XG4gIGlmICh2YWwpIHtcbiAgICBwbS5tb2QuYXV0b0lucHV0ID0gW107XG4gICAgcG0ucmVnaXN0cnkoXCJhdXRvSW5wdXRcIiwgZnVuY3Rpb24gKHJ1bGUsIHR5cGUpIHtcbiAgICAgIHBtLm1vZC5hdXRvSW5wdXQucHVzaChydWxlLm5hbWUpO1xuICAgICAgaWYgKHJ1bGUuaGFuZGxlci5iaW5kKSBydWxlID0gbmV3IF9pbnB1dHJ1bGVzLklucHV0UnVsZShydWxlLm5hbWUsIHJ1bGUubWF0Y2gsIHJ1bGUuZmlsdGVyLCBydWxlLmhhbmRsZXIuYmluZCh0eXBlKSk7XG4gICAgICAoMCwgX2lucHV0cnVsZXMuYWRkSW5wdXRSdWxlKShwbSwgcnVsZSk7XG4gICAgfSk7XG4gIH1cbn0pO1xuXG5fZWRpdC5kZWZhdWx0UmVnaXN0cnkucmVnaXN0ZXIoXCJhdXRvSW5wdXRcIiwgbmV3IF9pbnB1dHJ1bGVzLklucHV0UnVsZShcImVtRGFzaFwiLCAvLS0kLywgXCItXCIsIFwi4oCUXCIpKTtcblxuX2VkaXQuZGVmYXVsdFJlZ2lzdHJ5LnJlZ2lzdGVyKFwiYXV0b0lucHV0XCIsIG5ldyBfaW5wdXRydWxlcy5JbnB1dFJ1bGUoXCJvcGVuRG91YmxlUXVvdGVcIiwgL1xccyhcIikkLywgJ1wiJywgXCLigJxcIikpO1xuXG5fZWRpdC5kZWZhdWx0UmVnaXN0cnkucmVnaXN0ZXIoXCJhdXRvSW5wdXRcIiwgbmV3IF9pbnB1dHJ1bGVzLklucHV0UnVsZShcImNsb3NlRG91YmxlUXVvdGVcIiwgL1wiJC8sICdcIicsIFwi4oCdXCIpKTtcblxuX2VkaXQuZGVmYXVsdFJlZ2lzdHJ5LnJlZ2lzdGVyKFwiYXV0b0lucHV0XCIsIG5ldyBfaW5wdXRydWxlcy5JbnB1dFJ1bGUoXCJvcGVuU2luZ2xlUXVvdGVcIiwgL1xccygnKSQvLCBcIidcIiwgXCLigJhcIikpO1xuXG5fZWRpdC5kZWZhdWx0UmVnaXN0cnkucmVnaXN0ZXIoXCJhdXRvSW5wdXRcIiwgbmV3IF9pbnB1dHJ1bGVzLklucHV0UnVsZShcImNsb3NlU2luZ2xlUXVvdGVcIiwgLyckLywgXCInXCIsIFwi4oCZXCIpKTtcblxuX21vZGVsLkJsb2NrUXVvdGUucmVnaXN0ZXIoXCJhdXRvSW5wdXRcIiwgbmV3IF9pbnB1dHJ1bGVzLklucHV0UnVsZShcInN0YXJ0QmxvY2tRdW90ZVwiLCAvXlxccyo+ICQvLCBcIiBcIiwgZnVuY3Rpb24gKHBtLCBfLCBwb3MpIHtcbiAgd3JhcEFuZEpvaW4ocG0sIHBvcywgdGhpcyk7XG59KSk7XG5cbl9tb2RlbC5PcmRlcmVkTGlzdC5yZWdpc3RlcihcImF1dG9JbnB1dFwiLCBuZXcgX2lucHV0cnVsZXMuSW5wdXRSdWxlKFwic3RhcnRPcmRlcmVkTGlzdFwiLCAvXihcXGQrKVxcLiAkLywgXCIgXCIsIGZ1bmN0aW9uIChwbSwgbWF0Y2gsIHBvcykge1xuICB2YXIgb3JkZXIgPSArbWF0Y2hbMV07XG4gIHdyYXBBbmRKb2luKHBtLCBwb3MsIHRoaXMsIHsgb3JkZXI6IG9yZGVyIHx8IG51bGwgfSwgZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5zaXplICsgKG5vZGUuYXR0cnMub3JkZXIgfHwgMSkgPT0gb3JkZXI7XG4gIH0pO1xufSkpO1xuXG5fbW9kZWwuQnVsbGV0TGlzdC5yZWdpc3RlcihcImF1dG9JbnB1dFwiLCBuZXcgX2lucHV0cnVsZXMuSW5wdXRSdWxlKFwic3RhcnRCdWxsZXRMaXN0XCIsIC9eXFxzKihbLSsqXSkgJC8sIFwiIFwiLCBmdW5jdGlvbiAocG0sIG1hdGNoLCBwb3MpIHtcbiAgdmFyIGJ1bGxldCA9IG1hdGNoWzFdO1xuICB3cmFwQW5kSm9pbihwbSwgcG9zLCB0aGlzLCBudWxsLCBmdW5jdGlvbiAobm9kZSkge1xuICAgIHJldHVybiBub2RlLmF0dHJzLmJ1bGxldCA9PSBidWxsZXQ7XG4gIH0pO1xufSkpO1xuXG5fbW9kZWwuQ29kZUJsb2NrLnJlZ2lzdGVyKFwiYXV0b0lucHV0XCIsIG5ldyBfaW5wdXRydWxlcy5JbnB1dFJ1bGUoXCJzdGFydENvZGVCbG9ja1wiLCAvXmBgYCQvLCBcImBcIiwgZnVuY3Rpb24gKHBtLCBfLCBwb3MpIHtcbiAgc2V0QXMocG0sIHBvcywgdGhpcywgeyBwYXJhbXM6IFwiXCIgfSk7XG59KSk7XG5cbl9tb2RlbC5IZWFkaW5nLnJlZ2lzdGVyKFwiYXV0b0lucHV0XCIsIG5ldyBfaW5wdXRydWxlcy5JbnB1dFJ1bGUoXCJzdGFydEhlYWRpbmdcIiwgL14oI3sxLDZ9KSAkLywgXCIgXCIsIGZ1bmN0aW9uIChwbSwgbWF0Y2gsIHBvcykge1xuICBzZXRBcyhwbSwgcG9zLCB0aGlzLCB7IGxldmVsOiBtYXRjaFsxXS5sZW5ndGggfSk7XG59KSk7XG5cbmZ1bmN0aW9uIHdyYXBBbmRKb2luKHBtLCBwb3MsIHR5cGUpIHtcbiAgdmFyIGF0dHJzID0gYXJndW1lbnRzLmxlbmd0aCA8PSAzIHx8IGFyZ3VtZW50c1szXSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGFyZ3VtZW50c1szXTtcbiAgdmFyIHByZWRpY2F0ZSA9IGFyZ3VtZW50cy5sZW5ndGggPD0gNCB8fCBhcmd1bWVudHNbNF0gPT09IHVuZGVmaW5lZCA/IG51bGwgOiBhcmd1bWVudHNbNF07XG5cbiAgdmFyIGJlZm9yZSA9IHBvcy5zaG9ydGVuKCk7XG4gIHZhciBzaWJsaW5nID0gYmVmb3JlLm9mZnNldCA+IDAgJiYgcG0uZG9jLnBhdGgoYmVmb3JlLnBhdGgpLmNoaWxkKGJlZm9yZS5vZmZzZXQgLSAxKTtcbiAgdmFyIGpvaW4gPSBzaWJsaW5nICYmIHNpYmxpbmcudHlwZS5uYW1lID09IHR5cGUgJiYgKCFwcmVkaWNhdGUgfHwgcHJlZGljYXRlKHNpYmxpbmcpKTtcbiAgdmFyIHRyID0gcG0udHIud3JhcChwb3MsIHBvcywgdHlwZSwgYXR0cnMpO1xuICB2YXIgZGVsUG9zID0gdHIubWFwKHBvcykucG9zO1xuICB0cltcImRlbGV0ZVwiXShuZXcgX21vZGVsLlBvcyhkZWxQb3MucGF0aCwgMCksIGRlbFBvcyk7XG4gIGlmIChqb2luKSB0ci5qb2luKGJlZm9yZSk7XG4gIHRyLmFwcGx5KCk7XG59XG5cbmZ1bmN0aW9uIHNldEFzKHBtLCBwb3MsIHR5cGUsIGF0dHJzKSB7XG4gIHBtLnRyLnNldEJsb2NrVHlwZShwb3MsIHBvcywgdHlwZSwgYXR0cnMpW1wiZGVsZXRlXCJdKG5ldyBfbW9kZWwuUG9zKHBvcy5wYXRoLCAwKSwgcG9zKS5hcHBseSgpO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbmV4cG9ydHMuYWRkSW5wdXRSdWxlID0gYWRkSW5wdXRSdWxlO1xuZXhwb3J0cy5yZW1vdmVJbnB1dFJ1bGUgPSByZW1vdmVJbnB1dFJ1bGU7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBfbW9kZWwgPSByZXF1aXJlKFwiLi4vbW9kZWxcIik7XG5cbnZhciBfZWRpdCA9IHJlcXVpcmUoXCIuLi9lZGl0XCIpO1xuXG4vLyA6OiAoUHJvc2VNaXJyb3IsIElucHV0UnVsZSlcbi8vIEFkZCB0aGUgZ2l2ZW4gW2lucHV0IHJ1bGVdKCNJbnB1dFJ1bGUpIHRvIGFuIGVkaXRvci4gRnJvbSBub3cgb24sXG4vLyB3aGVuZXZlciB0aGUgcnVsZSdzIHBhdHRlcm4gaXMgdHlwZWQsIGl0cyBoYW5kbGVyIGlzIGFjdGl2YXRlZC5cbi8vXG4vLyBOb3RlIHRoYXQgdGhlIGVmZmVjdCBvZiBhbiBpbnB1dCBydWxlIGNhbiBiZSBjYW5jZWxlZCBieSBwcmVzc2luZ1xuLy8gQmFja3NwYWNlIHJpZ2h0IGFmdGVyIGl0IGhhcHBlbnMuXG5cbmZ1bmN0aW9uIGFkZElucHV0UnVsZShwbSwgcnVsZSkge1xuICBpZiAoIXBtLm1vZC5pbnRlcnByZXRJbnB1dCkgcG0ubW9kLmludGVycHJldElucHV0ID0gbmV3IElucHV0UnVsZXMocG0pO1xuICBwbS5tb2QuaW50ZXJwcmV0SW5wdXQuYWRkUnVsZShydWxlKTtcbn1cblxuLy8gOjogKFByb3NlTWlycm9yLCBzdHJpbmcpXG4vLyBSZW1vdmUgdGhlIGlucHV0IHJ1bGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSAoYWRkZWQgZWFybGllciB3aXRoXG4vLyBgYWRkSW5wdXRSdWxlYCkgZnJvbSB0aGUgZWRpdG9yLlxuXG5mdW5jdGlvbiByZW1vdmVJbnB1dFJ1bGUocG0sIG5hbWUpIHtcbiAgdmFyIGlpID0gcG0ubW9kLmludGVycHJldElucHV0O1xuICBpZiAoIWlpKSByZXR1cm47XG4gIGlpLnJlbW92ZVJ1bGUobmFtZSk7XG4gIGlmIChpaS5ydWxlcy5sZW5ndGggPT0gMCkge1xuICAgIGlpLnVucmVnaXN0ZXIoKTtcbiAgICBwbS5tb2QuaW50ZXJwcmV0SW5wdXQgPSBudWxsO1xuICB9XG59XG5cbi8vIDs7IElucHV0IHJ1bGVzIGFyZSByZWd1bGFyIGV4cHJlc3Npb25zIGRlc2NyaWJpbmcgYSBwaWVjZSBvZiB0ZXh0XG4vLyB0aGF0LCB3aGVuIHR5cGVkLCBjYXVzZXMgc29tZXRoaW5nIHRvIGhhcHBlbi4gVGhpcyBtaWdodCBiZVxuLy8gY2hhbmdpbmcgdHdvIGRhc2hlcyBpbnRvIGFuIGVtZGFzaCwgd3JhcHBpbmcgYSBwYXJhZ3JhcGggc3RhcnRpbmdcbi8vIHdpdGggYFwiPiBcImAgaW50byBhIGJsb2NrcXVvdGUsIG9yIHNvbWV0aGluZyBlbnRpcmVseSBkaWZmZXJlbnQuXG5cbnZhciBJbnB1dFJ1bGUgPVxuLy8gOjogKHN0cmluZywgUmVnRXhwLCA/c3RyaW5nLCB1bmlvbjxzdHJpbmcsIChQcm9zZU1pcnJvciwgW3N0cmluZ10sIFBvcyk+KVxuLy8gQ3JlYXRlIGFuIGlucHV0IHJ1bGUuIEl0cyBuYW1lIGlzIHVzZWQgdG8gaWRlbnRpZnkgaXQgKHRvIGRpc2FibGVcbi8vIGl0KS4gVGhlIHJ1bGUgYXBwbGllcyB3aGVuIHRoZSB1c2VyIHR5cGVkIHNvbWV0aGluZyBhbmQgdGhlIHRleHRcbi8vIGRpcmVjdGx5IGluIGZyb250IG9mIHRoZSBjdXJzb3IgbWF0Y2hlcyBgbWF0Y2hgLCB3aGljaCBzaG91bGRcbi8vIHByb2JhYmx5IGVuZCB3aXRoIGAkYC4gWW91IGNhbiBvcHRpb25hbGx5IHByb3ZpZGUgYSBmaWx0ZXIsIHdoaWNoXG4vLyBzaG91bGQgYmUgYSBzaW5nbGUgY2hhcmFjdGVyIHRoYXQgYWx3YXlzIGFwcGVhcnMgYXQgdGhlIGVuZCBvZlxuLy8gdGhlIG1hdGNoLCBhbmQgd2lsbCBiZSB1c2VkIHRvIG9ubHkgYXBwbHkgdGhlIHJ1bGUgd2hlbiB0aGVyZSdzXG4vLyBhbiBhY3R1YWwgY2hhbmNlIG9mIGl0IHN1Y2NlZWRpbmcuXG4vL1xuLy8gVGhlIGBoYW5kbGVyYCBjYW4gYmUgYSBzdHJpbmcsIGluIHdoaWNoIGNhc2UgdGhlIG1hdGNoZWQgdGV4dFxuLy8gd2lsbCBzaW1wbHkgYmUgcmVwbGFjZWQgYnkgdGhhdCBzdHJpbmcsIG9yIGEgZnVuY3Rpb24sIHdoaWNoIHdpbGxcbi8vIGJlIGNhbGxlZCB3aXRoIHRoZSBtYXRjaCBhcnJheSBwcm9kdWNlZCBieVxuLy8gW2BSZWdFeHAuZXhlY2BdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1JlZ0V4cC9leGVjKSxcbi8vIGFuZCBzaG91bGQgcHJvZHVjZSB0aGUgZWZmZWN0IG9mIHRoZSBydWxlLlxuZnVuY3Rpb24gSW5wdXRSdWxlKG5hbWUsIG1hdGNoLCBmaWx0ZXIsIGhhbmRsZXIpIHtcbiAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIElucHV0UnVsZSk7XG5cbiAgdGhpcy5uYW1lID0gbmFtZTtcbiAgdGhpcy5maWx0ZXIgPSBmaWx0ZXI7XG4gIHRoaXMubWF0Y2ggPSBtYXRjaDtcbiAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjtcbn07XG5cbmV4cG9ydHMuSW5wdXRSdWxlID0gSW5wdXRSdWxlO1xuXG52YXIgSW5wdXRSdWxlcyA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIElucHV0UnVsZXMocG0pIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIElucHV0UnVsZXMpO1xuXG4gICAgdGhpcy5wbSA9IHBtO1xuICAgIHRoaXMucnVsZXMgPSBbXTtcbiAgICB0aGlzLmNhbmNlbFZlcnNpb24gPSBudWxsO1xuXG4gICAgcG0ub24oXCJzZWxlY3Rpb25DaGFuZ2VcIiwgdGhpcy5vblNlbENoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdGhpcy5jYW5jZWxWZXJzaW9uID0gbnVsbDtcbiAgICB9KTtcbiAgICBwbS5vbihcInRleHRJbnB1dFwiLCB0aGlzLm9uVGV4dElucHV0ID0gdGhpcy5vblRleHRJbnB1dC5iaW5kKHRoaXMpKTtcbiAgICBwbS5hZGRLZXltYXAobmV3IF9lZGl0LktleW1hcCh7IEJhY2tzcGFjZTogZnVuY3Rpb24gQmFja3NwYWNlKHBtKSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5iYWNrc3BhY2UocG0pO1xuICAgICAgfSB9LCB7IG5hbWU6IFwiaW5wdXRSdWxlc1wiIH0pLCAyMCk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoSW5wdXRSdWxlcywgW3tcbiAgICBrZXk6IFwidW5yZWdpc3RlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1bnJlZ2lzdGVyKCkge1xuICAgICAgdGhpcy5wbS5vZmYoXCJzZWxlY3Rpb25DaGFuZ2VcIiwgdGhpcy5vblNlbENoYW5nZSk7XG4gICAgICB0aGlzLnBtLm9mZihcInRleHRJbnB1dFwiLCB0aGlzLm9uVGV4dElucHV0KTtcbiAgICAgIHRoaXMucG0ucmVtb3ZlS2V5bWFwKFwiaW5wdXRSdWxlc1wiKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkUnVsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRSdWxlKHJ1bGUpIHtcbiAgICAgIHRoaXMucnVsZXMucHVzaChydWxlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVtb3ZlUnVsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVSdWxlKG5hbWUpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5ydWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAodGhpcy5ydWxlc1tpXS5uYW1lID09IG5hbWUpIHtcbiAgICAgICAgICB0aGlzLnJ1bGVzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJvblRleHRJbnB1dFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvblRleHRJbnB1dCh0ZXh0KSB7XG4gICAgICB2YXIgcG9zID0gdGhpcy5wbS5zZWxlY3Rpb24uaGVhZDtcbiAgICAgIGlmICghcG9zKSByZXR1cm47XG5cbiAgICAgIHZhciB0ZXh0QmVmb3JlID0gdW5kZWZpbmVkLFxuICAgICAgICAgIGlzQ29kZSA9IHVuZGVmaW5lZDtcbiAgICAgIHZhciBsYXN0Q2ggPSB0ZXh0W3RleHQubGVuZ3RoIC0gMV07XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5ydWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcnVsZSA9IHRoaXMucnVsZXNbaV0sXG4gICAgICAgICAgICBtYXRjaCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHJ1bGUuZmlsdGVyICYmIHJ1bGUuZmlsdGVyICE9IGxhc3RDaCkgY29udGludWU7XG4gICAgICAgIGlmICh0ZXh0QmVmb3JlID09IG51bGwpIHtcbiAgICAgICAgICA7XG4gICAgICAgICAgdmFyIF9nZXRDb250ZXh0ID0gZ2V0Q29udGV4dCh0aGlzLnBtLmRvYywgcG9zKTtcblxuICAgICAgICAgIHRleHRCZWZvcmUgPSBfZ2V0Q29udGV4dC50ZXh0QmVmb3JlO1xuICAgICAgICAgIGlzQ29kZSA9IF9nZXRDb250ZXh0LmlzQ29kZTtcblxuICAgICAgICAgIGlmIChpc0NvZGUpIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF0Y2ggPSBydWxlLm1hdGNoLmV4ZWModGV4dEJlZm9yZSkpIHtcbiAgICAgICAgICB2YXIgc3RhcnRWZXJzaW9uID0gdGhpcy5wbS5oaXN0b3J5LmdldFZlcnNpb24oKTtcbiAgICAgICAgICBpZiAodHlwZW9mIHJ1bGUuaGFuZGxlciA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICB2YXIgb2Zmc2V0ID0gcG9zLm9mZnNldCAtIChtYXRjaFsxXSB8fCBtYXRjaFswXSkubGVuZ3RoO1xuICAgICAgICAgICAgdmFyIHN0YXJ0ID0gbmV3IF9tb2RlbC5Qb3MocG9zLnBhdGgsIG9mZnNldCk7XG4gICAgICAgICAgICB2YXIgbWFya3MgPSB0aGlzLnBtLmRvYy5tYXJrc0F0KHBvcyk7XG4gICAgICAgICAgICB0aGlzLnBtLnRyW1wiZGVsZXRlXCJdKHN0YXJ0LCBwb3MpLmluc2VydChzdGFydCwgdGhpcy5wbS5zY2hlbWEudGV4dChydWxlLmhhbmRsZXIsIG1hcmtzKSkuYXBwbHkoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcnVsZS5oYW5kbGVyKHRoaXMucG0sIG1hdGNoLCBwb3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmNhbmNlbFZlcnNpb24gPSBzdGFydFZlcnNpb247XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImJhY2tzcGFjZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBiYWNrc3BhY2UoKSB7XG4gICAgICBpZiAodGhpcy5jYW5jZWxWZXJzaW9uKSB7XG4gICAgICAgIHRoaXMucG0uaGlzdG9yeS5iYWNrVG9WZXJzaW9uKHRoaXMuY2FuY2VsVmVyc2lvbik7XG4gICAgICAgIHRoaXMuY2FuY2VsVmVyc2lvbiA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIElucHV0UnVsZXM7XG59KSgpO1xuXG5mdW5jdGlvbiBnZXRDb250ZXh0KGRvYywgcG9zKSB7XG4gIHZhciBwYXJlbnQgPSBkb2MucGF0aChwb3MucGF0aCk7XG4gIHZhciBpc0NvZGUgPSBwYXJlbnQudHlwZS5pc0NvZGU7XG4gIHZhciB0ZXh0QmVmb3JlID0gXCJcIjtcbiAgZm9yICh2YXIgaSA9IHBhcmVudC5pdGVyKDAsIHBvcy5vZmZzZXQpLCBjaGlsZCA9IHVuZGVmaW5lZDsgY2hpbGQgPSBpLm5leHQoKS52YWx1ZTspIHtcbiAgICBpZiAoY2hpbGQuaXNUZXh0KSB0ZXh0QmVmb3JlICs9IGNoaWxkLnRleHQ7ZWxzZSB0ZXh0QmVmb3JlID0gXCJcIjtcbiAgICBpZiAoaS5hdEVuZCgpICYmIGNoaWxkLm1hcmtzLnNvbWUoZnVuY3Rpb24gKHN0KSB7XG4gICAgICByZXR1cm4gc3QudHlwZS5pc0NvZGU7XG4gICAgfSkpIGlzQ29kZSA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIHsgdGV4dEJlZm9yZTogdGV4dEJlZm9yZSwgaXNDb2RlOiBpc0NvZGUgfTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZ2V0SWNvbiA9IGdldEljb247XG5cbnZhciBfZG9tID0gcmVxdWlyZShcIi4uL2RvbVwiKTtcblxudmFyIHN2Z0NvbGxlY3Rpb24gPSBudWxsO1xudmFyIHN2Z0J1aWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxudmFyIFNWRyA9IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIjtcbnZhciBYTElOSyA9IFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiO1xuXG5mdW5jdGlvbiBnZXRJY29uKG5hbWUsIGRhdGEpIHtcbiAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICBub2RlLmNsYXNzTmFtZSA9IFwiUHJvc2VNaXJyb3ItaWNvblwiO1xuICBpZiAoZGF0YS5wYXRoKSB7XG4gICAgaWYgKCFzdmdCdWlsdFtuYW1lXSkgYnVpbGRTVkcobmFtZSwgZGF0YSk7XG4gICAgdmFyIHN2ZyA9IG5vZGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWRywgXCJzdmdcIikpO1xuICAgIHN2Zy5zdHlsZS53aWR0aCA9IGRhdGEud2lkdGggLyBkYXRhLmhlaWdodCArIFwiZW1cIjtcbiAgICB2YXIgdXNlID0gc3ZnLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkcsIFwidXNlXCIpKTtcbiAgICB1c2Uuc2V0QXR0cmlidXRlTlMoWExJTkssIFwiaHJlZlwiLCBcIiNwbS1pY29uLVwiICsgbmFtZSk7XG4gIH0gZWxzZSB7XG4gICAgbm9kZS50ZXh0Q29udGVudCA9IGRhdGEudGV4dDtcbiAgICBpZiAoZGF0YS5jc3MpIG5vZGUuc3R5bGUuY3NzVGV4dCA9IGRhdGEuY3NzO1xuICB9XG4gIHJldHVybiBub2RlO1xufVxuXG5mdW5jdGlvbiBidWlsZFNWRyhuYW1lLCBkYXRhKSB7XG4gIGlmICghc3ZnQ29sbGVjdGlvbikge1xuICAgIHN2Z0NvbGxlY3Rpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHLCBcInN2Z1wiKTtcbiAgICBzdmdDb2xsZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICBkb2N1bWVudC5ib2R5Lmluc2VydEJlZm9yZShzdmdDb2xsZWN0aW9uLCBkb2N1bWVudC5ib2R5LmZpcnN0Q2hpbGQpO1xuICB9XG4gIHZhciBzeW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHLCBcInN5bWJvbFwiKTtcbiAgc3ltLmlkID0gXCJwbS1pY29uLVwiICsgbmFtZTtcbiAgc3ltLnNldEF0dHJpYnV0ZShcInZpZXdCb3hcIiwgXCIwIDAgXCIgKyBkYXRhLndpZHRoICsgXCIgXCIgKyBkYXRhLmhlaWdodCk7XG4gIHZhciBwYXRoID0gc3ltLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkcsIFwicGF0aFwiKSk7XG4gIHBhdGguc2V0QXR0cmlidXRlKFwiZFwiLCBkYXRhLnBhdGgpO1xuICBzdmdDb2xsZWN0aW9uLmFwcGVuZENoaWxkKHN5bSk7XG4gIHN2Z0J1aWx0W25hbWVdID0gdHJ1ZTtcbn1cblxuKDAsIF9kb20uaW5zZXJ0Q1NTKShcIlxcbi5Qcm9zZU1pcnJvci1pY29uIHtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIGxpbmUtaGVpZ2h0OiAuODtcXG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxuICBwYWRkaW5nOiAycHggOHB4O1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXG5cXG4uUHJvc2VNaXJyb3ItaWNvbi1hY3RpdmUge1xcbiAgYmFja2dyb3VuZDogIzY2NjtcXG4gIGJvcmRlci1yYWRpdXM6IDRweDtcXG59XFxuXFxuLlByb3NlTWlycm9yLWljb24gc3ZnIHtcXG4gIGZpbGw6IGN1cnJlbnRDb2xvcjtcXG4gIGhlaWdodDogMWVtO1xcbn1cXG5cIik7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZXhwb3J0cy5zaG93U2VsZWN0TWVudSA9IHNob3dTZWxlY3RNZW51O1xuZXhwb3J0cy5yZWFkUGFyYW1zID0gcmVhZFBhcmFtcztcbmV4cG9ydHMuY29tbWFuZEdyb3VwcyA9IGNvbW1hbmRHcm91cHM7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgX3Rvb2x0aXAgPSByZXF1aXJlKFwiLi90b29sdGlwXCIpO1xuXG52YXIgX2RvbSA9IHJlcXVpcmUoXCIuLi9kb21cIik7XG5cbnZhciBfZWRpdCA9IHJlcXVpcmUoXCIuLi9lZGl0XCIpO1xuXG52YXIgX3V0aWxTb3J0ZWRpbnNlcnQgPSByZXF1aXJlKFwiLi4vdXRpbC9zb3J0ZWRpbnNlcnRcIik7XG5cbnZhciBfdXRpbFNvcnRlZGluc2VydDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF91dGlsU29ydGVkaW5zZXJ0KTtcblxudmFyIF9pY29ucyA9IHJlcXVpcmUoXCIuL2ljb25zXCIpO1xuXG52YXIgTWVudSA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE1lbnUocG0sIGRpc3BsYXkpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTWVudSk7XG5cbiAgICB0aGlzLmRpc3BsYXkgPSBkaXNwbGF5O1xuICAgIHRoaXMuc3RhY2sgPSBbXTtcbiAgICB0aGlzLnBtID0gcG07XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoTWVudSwgW3tcbiAgICBrZXk6IFwic2hvd1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaG93KGNvbnRlbnQsIGRpc3BsYXlJbmZvKSB7XG4gICAgICB0aGlzLnN0YWNrLmxlbmd0aCA9IDA7XG4gICAgICB0aGlzLmVudGVyKGNvbnRlbnQsIGRpc3BsYXlJbmZvKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVzZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgICB0aGlzLnN0YWNrLmxlbmd0aCA9IDA7XG4gICAgICB0aGlzLmRpc3BsYXkucmVzZXQoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZW50ZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZW50ZXIoY29udGVudCwgZGlzcGxheUluZm8pIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHZhciBwaWVjZXMgPSBbXSxcbiAgICAgICAgICBleHBsb3JlID0gZnVuY3Rpb24gZXhwbG9yZSh2YWx1ZSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBleHBsb3JlKHZhbHVlW2ldKTtcbiAgICAgICAgICB9cGllY2VzLnB1c2goc2VwYXJhdG9yKTtcbiAgICAgICAgfSBlbHNlIGlmICghdmFsdWUuc2VsZWN0IHx8IHZhbHVlLnNlbGVjdChfdGhpcy5wbSkpIHtcbiAgICAgICAgICBwaWVjZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBleHBsb3JlKGNvbnRlbnQpO1xuICAgICAgLy8gUmVtb3ZlIHN1cGVyZmx1b3VzIHNlcGFyYXRvcnNcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGllY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChwaWVjZXNbaV0gPT0gc2VwYXJhdG9yICYmIChpID09IDAgfHwgaSA9PSBwaWVjZXMubGVuZ3RoIC0gMSB8fCBwaWVjZXNbaSArIDFdID09IHNlcGFyYXRvcikpIHBpZWNlcy5zcGxpY2UoaS0tLCAxKTtcbiAgICAgIH1pZiAoIXBpZWNlcy5sZW5ndGgpIHJldHVybiB0aGlzLmRpc3BsYXkuY2xlYXIoKTtcblxuICAgICAgdGhpcy5zdGFjay5wdXNoKHBpZWNlcyk7XG4gICAgICB0aGlzLmRyYXcoZGlzcGxheUluZm8pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkcmF3XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRyYXcoZGlzcGxheUluZm8pIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgY3VyID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdO1xuICAgICAgdmFyIHJlbmRlcmVkID0gKDAsIF9kb20uZWx0KShcImRpdlwiLCB7IFwiY2xhc3NcIjogXCJQcm9zZU1pcnJvci1tZW51XCIgfSwgY3VyLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICByZXR1cm4gcmVuZGVySXRlbShpdGVtLCBfdGhpczIpO1xuICAgICAgfSkpO1xuICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoID4gMSkgdGhpcy5kaXNwbGF5LmVudGVyKHJlbmRlcmVkLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfdGhpczIubGVhdmUoKTtcbiAgICAgIH0sIGRpc3BsYXlJbmZvKTtlbHNlIHRoaXMuZGlzcGxheS5zaG93KHJlbmRlcmVkLCBkaXNwbGF5SW5mbyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImxlYXZlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGxlYXZlKCkge1xuICAgICAgdGhpcy5zdGFjay5wb3AoKTtcbiAgICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCkgdGhpcy5kcmF3KCk7ZWxzZSB0aGlzLmRpc3BsYXkucmVzZXQoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWN0aXZlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGFjay5sZW5ndGggPiAxO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBNZW51O1xufSkoKTtcblxuZXhwb3J0cy5NZW51ID0gTWVudTtcblxudmFyIFRvb2x0aXBEaXNwbGF5ID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gVG9vbHRpcERpc3BsYXkodG9vbHRpcCwgcmVzZXRGdW5jKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRvb2x0aXBEaXNwbGF5KTtcblxuICAgIHRoaXMudG9vbHRpcCA9IHRvb2x0aXA7XG4gICAgdGhpcy5yZXNldEZ1bmMgPSByZXNldEZ1bmM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoVG9vbHRpcERpc3BsYXksIFt7XG4gICAga2V5OiBcImNsZWFyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgdGhpcy50b29sdGlwLmNsb3NlKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlc2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgICAgaWYgKHRoaXMucmVzZXRGdW5jKSB0aGlzLnJlc2V0RnVuYygpO2Vsc2UgdGhpcy5jbGVhcigpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzaG93XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNob3coZG9tLCBpbmZvKSB7XG4gICAgICB0aGlzLnRvb2x0aXAub3Blbihkb20sIGluZm8pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJlbnRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlbnRlcihkb20sIGJhY2ssIGluZm8pIHtcbiAgICAgIHZhciBidXR0b24gPSAoMCwgX2RvbS5lbHQpKFwiZGl2XCIsIHsgXCJjbGFzc1wiOiBcIlByb3NlTWlycm9yLXRvb2x0aXAtYmFja1wiLCB0aXRsZTogXCJCYWNrXCIgfSk7XG4gICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7ZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgYmFjaygpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnNob3coKDAsIF9kb20uZWx0KShcImRpdlwiLCB7IFwiY2xhc3NcIjogXCJQcm9zZU1pcnJvci10b29sdGlwLWJhY2std3JhcHBlclwiIH0sIGRvbSwgYnV0dG9uKSwgaW5mbyk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFRvb2x0aXBEaXNwbGF5O1xufSkoKTtcblxuZXhwb3J0cy5Ub29sdGlwRGlzcGxheSA9IFRvb2x0aXBEaXNwbGF5O1xuXG5mdW5jdGlvbiB0aXRsZShwbSwgY29tbWFuZCkge1xuICB2YXIga2V5ID0gcG0ua2V5Rm9yQ29tbWFuZChjb21tYW5kLm5hbWUpO1xuICByZXR1cm4ga2V5ID8gY29tbWFuZC5sYWJlbCArIFwiIChcIiArIGtleSArIFwiKVwiIDogY29tbWFuZC5sYWJlbDtcbn1cblxuZnVuY3Rpb24gcmVuZGVySWNvbihjb21tYW5kLCBtZW51KSB7XG4gIHZhciBpY29uID0gcmVzb2x2ZUljb24obWVudS5wbSwgY29tbWFuZCk7XG4gIGlmIChjb21tYW5kLmFjdGl2ZShtZW51LnBtKSkgaWNvbi5jbGFzc05hbWUgKz0gXCIgUHJvc2VNaXJyb3ItaWNvbi1hY3RpdmVcIjtcbiAgdmFyIGRvbSA9ICgwLCBfZG9tLmVsdCkoXCJzcGFuXCIsIHsgXCJjbGFzc1wiOiBcIlByb3NlTWlycm9yLW1lbnVpY29uXCIsIHRpdGxlOiB0aXRsZShtZW51LnBtLCBjb21tYW5kKSB9LCBpY29uKTtcbiAgZG9tLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgZnVuY3Rpb24gKGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7ZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAoIWNvbW1hbmQucGFyYW1zLmxlbmd0aCkge1xuICAgICAgY29tbWFuZC5leGVjKG1lbnUucG0pO1xuICAgICAgbWVudS5yZXNldCgpO1xuICAgIH0gZWxzZSBpZiAoY29tbWFuZC5wYXJhbXMubGVuZ3RoID09IDEgJiYgY29tbWFuZC5wYXJhbXNbMF0udHlwZSA9PSBcInNlbGVjdFwiKSB7XG4gICAgICBzaG93U2VsZWN0TWVudShtZW51LnBtLCBjb21tYW5kLCBkb20pO1xuICAgIH0gZWxzZSB7XG4gICAgICBtZW51LmVudGVyKHJlYWRQYXJhbXMoY29tbWFuZCkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBkb207XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVJY29uKHBtLCBjb21tYW5kKSB7XG4gIGZvciAoOzspIHtcbiAgICB2YXIgaWNvbiA9IGNvbW1hbmQuc3BlYy5pY29uO1xuICAgIGlmICghaWNvbikgYnJlYWs7XG4gICAgaWYgKGljb24uZnJvbSkge1xuICAgICAgY29tbWFuZCA9IHBtLmNvbW1hbmRzW2ljb24uZnJvbV07XG4gICAgICBpZiAoIWNvbW1hbmQpIGJyZWFrO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gKDAsIF9pY29ucy5nZXRJY29uKShjb21tYW5kLm5hbWUsIGljb24pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gKDAsIF9pY29ucy5nZXRJY29uKShcImRlZmF1bHRcIiwgeyB0ZXh0OiBcIuKcmFwiIH0pO1xufVxuXG5mdW5jdGlvbiByZW5kZXJTZWxlY3QoaXRlbSwgbWVudSkge1xuICB2YXIgcGFyYW0gPSBpdGVtLnBhcmFtc1swXTtcbiAgdmFyIHZhbHVlID0gIXBhcmFtW1wiZGVmYXVsdFwiXSA/IG51bGwgOiBwYXJhbVtcImRlZmF1bHRcIl0uY2FsbCA/IHBhcmFtW1wiZGVmYXVsdFwiXShtZW51LnBtKSA6IHBhcmFtW1wiZGVmYXVsdFwiXTtcblxuICB2YXIgZG9tID0gKDAsIF9kb20uZWx0KShcImRpdlwiLCB7IFwiY2xhc3NcIjogXCJQcm9zZU1pcnJvci1zZWxlY3QgUHJvc2VNaXJyb3Itc2VsZWN0LWNvbW1hbmQtXCIgKyBpdGVtLm5hbWUsIHRpdGxlOiBpdGVtLmxhYmVsIH0sICF2YWx1ZSA/IHBhcmFtLmRlZmF1bHRMYWJlbCB8fCBcIlNlbGVjdC4uLlwiIDogdmFsdWUuZGlzcGxheSA/IHZhbHVlLmRpc3BsYXkodmFsdWUpIDogdmFsdWUubGFiZWwpO1xuICBkb20uYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCBmdW5jdGlvbiAoZSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHNob3dTZWxlY3RNZW51KG1lbnUucG0sIGl0ZW0sIGRvbSk7XG4gIH0pO1xuICByZXR1cm4gZG9tO1xufVxuXG5mdW5jdGlvbiBzaG93U2VsZWN0TWVudShwbSwgaXRlbSwgZG9tKSB7XG4gIHZhciBwYXJhbSA9IGl0ZW0ucGFyYW1zWzBdO1xuICB2YXIgb3B0aW9ucyA9IHBhcmFtLm9wdGlvbnMuY2FsbCA/IHBhcmFtLm9wdGlvbnMocG0pIDogcGFyYW0ub3B0aW9ucztcbiAgdmFyIG1lbnUgPSAoMCwgX2RvbS5lbHQpKFwiZGl2XCIsIHsgXCJjbGFzc1wiOiBcIlByb3NlTWlycm9yLXNlbGVjdC1tZW51XCIgfSwgb3B0aW9ucy5tYXAoZnVuY3Rpb24gKG8pIHtcbiAgICB2YXIgZG9tID0gKDAsIF9kb20uZWx0KShcImRpdlwiLCBudWxsLCBvLmRpc3BsYXkgPyBvLmRpc3BsYXkobykgOiBvLmxhYmVsKTtcbiAgICBkb20uYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaXRlbS5leGVjKHBtLCBbby52YWx1ZV0pO1xuICAgICAgZmluaXNoKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGRvbTtcbiAgfSkpO1xuICB2YXIgcG9zID0gZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgICAgYm94ID0gcG0ud3JhcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgbWVudS5zdHlsZS5sZWZ0ID0gcG9zLmxlZnQgLSBib3gubGVmdCAtIDIgKyBcInB4XCI7XG4gIG1lbnUuc3R5bGUudG9wID0gcG9zLnRvcCAtIGJveC50b3AgLSAyICsgXCJweFwiO1xuXG4gIHZhciBkb25lID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGZpbmlzaCgpIHtcbiAgICBpZiAoZG9uZSkgcmV0dXJuO1xuICAgIGRvbmUgPSB0cnVlO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCBmaW5pc2gpO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgZmluaXNoKTtcbiAgICBwbS53cmFwcGVyLnJlbW92ZUNoaWxkKG1lbnUpO1xuICB9XG4gIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCBmaW5pc2gpO1xuICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIGZpbmlzaCk7XG4gIHBtLndyYXBwZXIuYXBwZW5kQ2hpbGQobWVudSk7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckl0ZW0oaXRlbSwgbWVudSkge1xuICB2YXIgZGlzcGxheSA9IGl0ZW0uZGlzcGxheSB8fCBpdGVtLnNwZWMuZGlzcGxheSB8fCBcImljb25cIjtcbiAgaWYgKGRpc3BsYXkgPT0gXCJpY29uXCIpIHJldHVybiByZW5kZXJJY29uKGl0ZW0sIG1lbnUpO2Vsc2UgaWYgKGRpc3BsYXkgPT0gXCJzZWxlY3RcIikgcmV0dXJuIHJlbmRlclNlbGVjdChpdGVtLCBtZW51KTtlbHNlIGlmICghZGlzcGxheSkgdGhyb3cgbmV3IEVycm9yKFwiQ29tbWFuZCBcIiArIGl0ZW0ubmFtZSArIFwiIGNhbiBub3QgYmUgc2hvd24gaW4gYSBtZW51XCIpO2Vsc2UgcmV0dXJuIGRpc3BsYXkuY2FsbChpdGVtLCBtZW51KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQYXJhbUZvcm0ocG0sIGNvbW1hbmQpIHtcbiAgdmFyIHByZWZpbGwgPSBjb21tYW5kLnNwZWMucHJlZmlsbFBhcmFtcyAmJiBjb21tYW5kLnNwZWMucHJlZmlsbFBhcmFtcyhwbSk7XG4gIHZhciBmaWVsZHMgPSBjb21tYW5kLnBhcmFtcy5tYXAoZnVuY3Rpb24gKHBhcmFtLCBpKSB7XG4gICAgdmFyIGZpZWxkID0gdW5kZWZpbmVkLFxuICAgICAgICBuYW1lID0gXCJmaWVsZF9cIiArIGk7XG4gICAgdmFyIHZhbCA9IHByZWZpbGwgPyBwcmVmaWxsW2ldIDogcGFyYW1bXCJkZWZhdWx0XCJdIHx8IFwiXCI7XG4gICAgaWYgKHBhcmFtLnR5cGUgPT0gXCJ0ZXh0XCIpIGZpZWxkID0gKDAsIF9kb20uZWx0KShcImlucHV0XCIsIHsgbmFtZTogbmFtZSwgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICBwbGFjZWhvbGRlcjogcGFyYW0ubGFiZWwsXG4gICAgICB2YWx1ZTogdmFsLFxuICAgICAgYXV0b2NvbXBsZXRlOiBcIm9mZlwiIH0pO2Vsc2UgaWYgKHBhcmFtLnR5cGUgPT0gXCJzZWxlY3RcIikgZmllbGQgPSAoMCwgX2RvbS5lbHQpKFwic2VsZWN0XCIsIHsgbmFtZTogbmFtZSB9LCAocGFyYW0ub3B0aW9ucy5jYWxsID8gcGFyYW0ub3B0aW9ucyhwbSkgOiBwYXJhbS5vcHRpb25zKS5tYXAoZnVuY3Rpb24gKG8pIHtcbiAgICAgIHJldHVybiAoMCwgX2RvbS5lbHQpKFwib3B0aW9uXCIsIHsgdmFsdWU6IG8udmFsdWUsIHNlbGVjdGVkOiBvLnZhbHVlID09IHZhbCB9LCBvLmxhYmVsKTtcbiAgICB9KSk7ZWxzZSAvLyBGSVhNRSBtb3JlIHR5cGVzXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBwYXJhbWV0ZXIgdHlwZTogXCIgKyBwYXJhbS50eXBlKTtcbiAgICByZXR1cm4gKDAsIF9kb20uZWx0KShcImRpdlwiLCBudWxsLCBmaWVsZCk7XG4gIH0pO1xuICByZXR1cm4gKDAsIF9kb20uZWx0KShcImZvcm1cIiwgbnVsbCwgZmllbGRzKTtcbn1cblxuZnVuY3Rpb24gZ2F0aGVyUGFyYW1zKHBtLCBjb21tYW5kLCBmb3JtKSB7XG4gIHZhciBiYWQgPSBmYWxzZTtcbiAgdmFyIHBhcmFtcyA9IGNvbW1hbmQucGFyYW1zLm1hcChmdW5jdGlvbiAocGFyYW0sIGkpIHtcbiAgICB2YXIgdmFsID0gZm9ybS5lbGVtZW50c1tcImZpZWxkX1wiICsgaV0udmFsdWU7XG4gICAgaWYgKHZhbCkgcmV0dXJuIHZhbDtcbiAgICBpZiAocGFyYW1bXCJkZWZhdWx0XCJdID09IG51bGwpIGJhZCA9IHRydWU7ZWxzZSByZXR1cm4gcGFyYW1bXCJkZWZhdWx0XCJdLmNhbGwgPyBwYXJhbVtcImRlZmF1bHRcIl0ocG0pIDogcGFyYW1bXCJkZWZhdWx0XCJdO1xuICB9KTtcbiAgcmV0dXJuIGJhZCA/IG51bGwgOiBwYXJhbXM7XG59XG5cbmZ1bmN0aW9uIHBhcmFtRm9ybShwbSwgY29tbWFuZCwgY2FsbGJhY2spIHtcbiAgdmFyIGZvcm0gPSBidWlsZFBhcmFtRm9ybShwbSwgY29tbWFuZCksXG4gICAgICBkb25lID0gZmFsc2U7XG5cbiAgdmFyIGZpbmlzaCA9IGZ1bmN0aW9uIGZpbmlzaChyZXN1bHQpIHtcbiAgICBpZiAoIWRvbmUpIHtcbiAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgY2FsbGJhY2socmVzdWx0KTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHN1Ym1pdCA9IGZ1bmN0aW9uIHN1Ym1pdCgpIHtcbiAgICAvLyBGSVhNRSBlcnJvciBtZXNzYWdlc1xuICAgIGZpbmlzaChnYXRoZXJQYXJhbXMocG0sIGNvbW1hbmQsIGZvcm0pKTtcbiAgfTtcbiAgZm9ybS5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHN1Ym1pdCgpO1xuICB9KTtcbiAgZm9ybS5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBmdW5jdGlvbiAoZSkge1xuICAgIGlmIChlLmtleUNvZGUgPT0gMjcpIHtcbiAgICAgIGZpbmlzaChudWxsKTtcbiAgICB9IGVsc2UgaWYgKGUua2V5Q29kZSA9PSAxMyAmJiAhKGUuY3RybEtleSB8fCBlLm1ldGFLZXkgfHwgZS5zaGlmdEtleSkpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHN1Ym1pdCgpO1xuICAgIH1cbiAgfSk7XG4gIC8vIEZJWE1FIHRvbyBoYWNreT9cbiAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGlucHV0ID0gZm9ybS5xdWVyeVNlbGVjdG9yKFwiaW5wdXQsIHRleHRhcmVhXCIpO1xuICAgIGlmIChpbnB1dCkgaW5wdXQuZm9jdXMoKTtcbiAgfSwgMjApO1xuXG4gIHJldHVybiBmb3JtO1xufVxuXG5mdW5jdGlvbiByZWFkUGFyYW1zKGNvbW1hbmQpIHtcbiAgcmV0dXJuIHsgZGlzcGxheTogZnVuY3Rpb24gZGlzcGxheShtZW51KSB7XG4gICAgICByZXR1cm4gcGFyYW1Gb3JtKG1lbnUucG0sIGNvbW1hbmQsIGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgbWVudS5wbS5mb2N1cygpO1xuICAgICAgICBpZiAocGFyYW1zKSB7XG4gICAgICAgICAgY29tbWFuZC5leGVjKG1lbnUucG0sIHBhcmFtcyk7XG4gICAgICAgICAgbWVudS5yZXNldCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1lbnUubGVhdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSB9O1xufVxuXG52YXIgc2VwYXJhdG9yID0ge1xuICBkaXNwbGF5OiBmdW5jdGlvbiBkaXNwbGF5KCkge1xuICAgIHJldHVybiAoMCwgX2RvbS5lbHQpKFwiZGl2XCIsIHsgXCJjbGFzc1wiOiBcIlByb3NlTWlycm9yLW1lbnVzZXBhcmF0b3JcIiB9KTtcbiAgfVxufTtcblxuZnVuY3Rpb24gY29tbWFuZEdyb3VwcyhwbSkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgbmFtZXMgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgbmFtZXNbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgcmV0dXJuIG5hbWVzLm1hcChmdW5jdGlvbiAoZ3JvdXApIHtcbiAgICB2YXIgZm91bmQgPSBbXTtcbiAgICBmb3IgKHZhciBfbmFtZSBpbiBwbS5jb21tYW5kcykge1xuICAgICAgdmFyIGNtZCA9IHBtLmNvbW1hbmRzW19uYW1lXTtcbiAgICAgIGlmIChjbWQuc3BlYy5tZW51R3JvdXAgJiYgY21kLnNwZWMubWVudUdyb3VwID09IGdyb3VwKSAoMCwgX3V0aWxTb3J0ZWRpbnNlcnQyW1wiZGVmYXVsdFwiXSkoZm91bmQsIGNtZCwgZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIChhLnNwZWMubWVudVJhbmsgfHwgNTApIC0gKGIuc3BlYy5tZW51UmFuayB8fCA1MCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGZvdW5kO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gdG9vbHRpcFBhcmFtSGFuZGxlcihwbSwgY29tbWFuZCwgY2FsbGJhY2spIHtcbiAgdmFyIHRvb2x0aXAgPSBuZXcgX3Rvb2x0aXAuVG9vbHRpcChwbSwgXCJjZW50ZXJcIik7XG4gIHRvb2x0aXAub3BlbihwYXJhbUZvcm0ocG0sIGNvbW1hbmQsIGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICBwbS5mb2N1cygpO1xuICAgIHRvb2x0aXAuY2xvc2UoKTtcbiAgICBjYWxsYmFjayhwYXJhbXMpO1xuICB9KSk7XG59XG5cbigwLCBfZWRpdC5kZWZpbmVQYXJhbUhhbmRsZXIpKFwiZGVmYXVsdFwiLCB0b29sdGlwUGFyYW1IYW5kbGVyKTtcbigwLCBfZWRpdC5kZWZpbmVQYXJhbUhhbmRsZXIpKFwidG9vbHRpcFwiLCB0b29sdGlwUGFyYW1IYW5kbGVyKTtcblxuLy8gRklYTUUgY2hlY2sgZm9yIG9ic29sZXRlIHN0eWxlc1xuKDAsIF9kb20uaW5zZXJ0Q1NTKShcIlxcblxcbi5Qcm9zZU1pcnJvci1tZW51IHtcXG4gIG1hcmdpbjogMCAtNHB4O1xcbiAgbGluZS1oZWlnaHQ6IDE7XFxuICB3aGl0ZS1zcGFjZTogcHJlO1xcbn1cXG4uUHJvc2VNaXJyb3ItdG9vbHRpcCAuUHJvc2VNaXJyb3ItbWVudSB7XFxuICB3aWR0aDogLXdlYmtpdC1maXQtY29udGVudDtcXG4gIHdpZHRoOiBmaXQtY29udGVudDtcXG59XFxuXFxuLlByb3NlTWlycm9yLXRvb2x0aXAtYmFjay13cmFwcGVyIHtcXG4gIHBhZGRpbmctbGVmdDogMTJweDtcXG59XFxuLlByb3NlTWlycm9yLXRvb2x0aXAtYmFjayB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICB0b3A6IDVweDsgbGVmdDogNXB4O1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXG4uUHJvc2VNaXJyb3ItdG9vbHRpcC1iYWNrOmFmdGVyIHtcXG4gIGNvbnRlbnQ6IFxcXCLCq1xcXCI7XFxufVxcblxcbi5Qcm9zZU1pcnJvci1tZW51aWNvbiB7XFxuICBtYXJnaW46IDAgN3B4O1xcbn1cXG5cXG4uUHJvc2VNaXJyb3ItbWVudXNlcGFyYXRvciB7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxufVxcbi5Qcm9zZU1pcnJvci1tZW51c2VwYXJhdG9yOmFmdGVyIHtcXG4gIGNvbnRlbnQ6IFxcXCLvuJlcXFwiO1xcbiAgb3BhY2l0eTogMC41O1xcbiAgcGFkZGluZzogMCA0cHg7XFxuICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7XFxufVxcblxcbi5Qcm9zZU1pcnJvci1zZWxlY3QsIC5Qcm9zZU1pcnJvci1zZWxlY3QtbWVudSB7XFxuICBib3JkZXI6IDFweCBzb2xpZCAjNzc3O1xcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xcbiAgZm9udC1zaXplOiA5MCU7XFxufVxcblxcbi5Qcm9zZU1pcnJvci1zZWxlY3Qge1xcbiAgcGFkZGluZzogMXB4IDEycHggMXB4IDRweDtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxuICBtYXJnaW46IDAgOHB4O1xcbn1cXG5cXG4uUHJvc2VNaXJyb3Itc2VsZWN0LWNvbW1hbmQtdGV4dGJsb2NrVHlwZSB7XFxuICBtaW4td2lkdGg6IDMuMmVtO1xcbn1cXG5cXG4uUHJvc2VNaXJyb3Itc2VsZWN0OmFmdGVyIHtcXG4gIGNvbnRlbnQ6IFxcXCLilr9cXFwiO1xcbiAgY29sb3I6ICM3Nzc7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICByaWdodDogNHB4O1xcbn1cXG5cXG4uUHJvc2VNaXJyb3Itc2VsZWN0LW1lbnUge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgYmFja2dyb3VuZDogIzQ0NDtcXG4gIGNvbG9yOiB3aGl0ZTtcXG4gIHBhZGRpbmc6IDJweCAycHg7XFxuICB6LWluZGV4OiAxNTtcXG59XFxuLlByb3NlTWlycm9yLXNlbGVjdC1tZW51IGRpdiB7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxuICBwYWRkaW5nOiAwIDFlbSAwIDJweDtcXG59XFxuLlByb3NlTWlycm9yLXNlbGVjdC1tZW51IGRpdjpob3ZlciB7XFxuICBiYWNrZ3JvdW5kOiAjNzc3O1xcbn1cXG5cXG5cIik7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIF9lZGl0ID0gcmVxdWlyZShcIi4uL2VkaXRcIik7XG5cbnZhciBfZG9tID0gcmVxdWlyZShcIi4uL2RvbVwiKTtcblxudmFyIF91cGRhdGUgPSByZXF1aXJlKFwiLi91cGRhdGVcIik7XG5cbnZhciBfbWVudSA9IHJlcXVpcmUoXCIuL21lbnVcIik7XG5cbigwLCBfZWRpdC5kZWZpbmVPcHRpb24pKFwibWVudUJhclwiLCBmYWxzZSwgZnVuY3Rpb24gKHBtLCB2YWx1ZSkge1xuICBpZiAocG0ubW9kLm1lbnVCYXIpIHBtLm1vZC5tZW51QmFyLmRldGFjaCgpO1xuICBwbS5tb2QubWVudUJhciA9IHZhbHVlID8gbmV3IE1lbnVCYXIocG0sIHZhbHVlKSA6IG51bGw7XG59KTtcblxudmFyIEJhckRpc3BsYXkgPSAoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBCYXJEaXNwbGF5KGNvbnRhaW5lciwgcmVzZXRGdW5jKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEJhckRpc3BsYXkpO1xuXG4gICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7XG4gICAgdGhpcy5yZXNldEZ1bmMgPSByZXNldEZ1bmM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoQmFyRGlzcGxheSwgW3tcbiAgICBrZXk6IFwiY2xlYXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgICB0aGlzLmNvbnRhaW5lci50ZXh0Q29udGVudCA9IFwiXCI7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlc2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgICAgdGhpcy5yZXNldEZ1bmMoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2hvd1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaG93KGRvbSkge1xuICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQoZG9tKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZW50ZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZW50ZXIoZG9tLCBiYWNrKSB7XG4gICAgICB2YXIgY3VycmVudCA9IHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQ7XG4gICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICBjdXJyZW50LnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICAgICAgICBjdXJyZW50LnN0eWxlLm9wYWNpdHkgPSBcIjAuNVwiO1xuICAgICAgfVxuICAgICAgdmFyIGJhY2tCdXR0b24gPSAoMCwgX2RvbS5lbHQpKFwiZGl2XCIsIHsgXCJjbGFzc1wiOiBcIlByb3NlTWlycm9yLW1lbnViYXItYmFja1wiIH0pO1xuICAgICAgYmFja0J1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBiYWNrKCk7XG4gICAgICB9KTtcbiAgICAgIHZhciBhZGRlZCA9ICgwLCBfZG9tLmVsdCkoXCJkaXZcIiwgeyBcImNsYXNzXCI6IFwiUHJvc2VNaXJyb3ItbWVudWJhci1zbGlkaW5nXCIgfSwgYmFja0J1dHRvbiwgZG9tKTtcbiAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKGFkZGVkKTtcbiAgICAgIGFkZGVkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOyAvLyBGb3JjZSBsYXlvdXQgZm9yIHRyYW5zaXRpb25cbiAgICAgIGFkZGVkLnN0eWxlLmxlZnQgPSBcIjBcIjtcbiAgICAgIGFkZGVkLmFkZEV2ZW50TGlzdGVuZXIoXCJ0cmFuc2l0aW9uZW5kXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGN1cnJlbnQgJiYgY3VycmVudC5wYXJlbnROb2RlKSBjdXJyZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY3VycmVudCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQmFyRGlzcGxheTtcbn0pKCk7XG5cbnZhciBNZW51QmFyID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTWVudUJhcihwbSwgY29uZmlnKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBNZW51QmFyKTtcblxuICAgIHRoaXMucG0gPSBwbTtcblxuICAgIHRoaXMubWVudUVsdCA9ICgwLCBfZG9tLmVsdCkoXCJkaXZcIiwgeyBcImNsYXNzXCI6IFwiUHJvc2VNaXJyb3ItbWVudWJhci1pbm5lclwiIH0pO1xuICAgIHRoaXMud3JhcHBlciA9ICgwLCBfZG9tLmVsdCkoXCJkaXZcIiwgeyBcImNsYXNzXCI6IFwiUHJvc2VNaXJyb3ItbWVudWJhclwiIH0sICgwLCBfZG9tLmVsdCkoXCJkaXZcIiwgeyBcImNsYXNzXCI6IFwiUHJvc2VNaXJyb3ItbWVudVwiLCBzdHlsZTogXCJ2aXNpYmlsaXR5OiBoaWZmZGRlbjsgei1pbmRleDogMTAwXCIgfSwgKDAsIF9kb20uZWx0KShcInNwYW5cIiwgeyBcImNsYXNzXCI6IFwiUHJvc2VNaXJyb3ItbWVudWljb25cIiB9LCAoMCwgX2RvbS5lbHQpKFwiZGl2XCIsIHsgXCJjbGFzc1wiOiBcIlByb3NlTWlycm9yLWljb25cIiB9LCBcInhcIikpKSwgdGhpcy5tZW51RWx0KTtcbiAgICBwbS53cmFwcGVyLmluc2VydEJlZm9yZSh0aGlzLndyYXBwZXIsIHBtLndyYXBwZXIuZmlyc3RDaGlsZCk7XG5cbiAgICB0aGlzLnVwZGF0ZSA9IG5ldyBfdXBkYXRlLk1lbnVVcGRhdGUocG0sIFwic2VsZWN0aW9uQ2hhbmdlIGNoYW5nZSBhY3RpdmVNYXJrQ2hhbmdlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdGhpcy5wcmVwYXJlVXBkYXRlKCk7XG4gICAgfSk7XG4gICAgdGhpcy5tZW51ID0gbmV3IF9tZW51Lk1lbnUocG0sIG5ldyBCYXJEaXNwbGF5KHRoaXMubWVudUVsdCwgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLnJlc2V0TWVudSgpO1xuICAgIH0pKTtcblxuICAgIHRoaXMubWVudUl0ZW1zID0gY29uZmlnICYmIGNvbmZpZy5pdGVtcyB8fCAoMCwgX21lbnUuY29tbWFuZEdyb3VwcykocG0sIFwiaW5saW5lXCIsIFwiYmxvY2tcIiwgXCJoaXN0b3J5XCIpO1xuICAgIHRoaXMudXBkYXRlLmZvcmNlKCk7XG5cbiAgICB0aGlzLmZsb2F0aW5nID0gZmFsc2U7XG4gICAgaWYgKGNvbmZpZyAmJiBjb25maWcuZmxvYXQpIHtcbiAgICAgIHRoaXMudXBkYXRlRmxvYXQoKTtcbiAgICAgIHRoaXMuc2Nyb2xsRnVuYyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFkb2N1bWVudC5ib2R5LmNvbnRhaW5zKF90aGlzLnBtLndyYXBwZXIpKSB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCBfdGhpcy5zY3JvbGxGdW5jKTtlbHNlIF90aGlzLnVwZGF0ZUZsb2F0KCk7XG4gICAgICB9O1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5zY3JvbGxGdW5jKTtcbiAgICB9XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoTWVudUJhciwgW3tcbiAgICBrZXk6IFwiZGV0YWNoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRldGFjaCgpIHtcbiAgICAgIHRoaXMudXBkYXRlLmRldGFjaCgpO1xuICAgICAgdGhpcy53cmFwcGVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy53cmFwcGVyKTtcblxuICAgICAgaWYgKHRoaXMuc2Nyb2xsRnVuYykgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5zY3JvbGxGdW5jKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicHJlcGFyZVVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwcmVwYXJlVXBkYXRlKCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBzY3JvbGxDdXJzb3IgPSB0aGlzLnByZXBhcmVTY3JvbGxDdXJzb3IoKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghX3RoaXMyLm1lbnUuYWN0aXZlKSBfdGhpczIucmVzZXRNZW51KCk7XG4gICAgICAgIGlmIChzY3JvbGxDdXJzb3IpIHNjcm9sbEN1cnNvcigpO1xuICAgICAgfTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVzZXRNZW51XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2V0TWVudSgpIHtcbiAgICAgIHRoaXMubWVudS5zaG93KHRoaXMubWVudUl0ZW1zKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidXBkYXRlRmxvYXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlRmxvYXQoKSB7XG4gICAgICB2YXIgZWRpdG9yUmVjdCA9IHRoaXMucG0ud3JhcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGlmICh0aGlzLmZsb2F0aW5nKSB7XG4gICAgICAgIGlmIChlZGl0b3JSZWN0LnRvcCA+PSAwIHx8IGVkaXRvclJlY3QuYm90dG9tIDwgdGhpcy5tZW51RWx0Lm9mZnNldEhlaWdodCArIDEwKSB7XG4gICAgICAgICAgdGhpcy5mbG9hdGluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMubWVudUVsdC5zdHlsZS5wb3NpdGlvbiA9IHRoaXMubWVudUVsdC5zdHlsZS5sZWZ0ID0gdGhpcy5tZW51RWx0LnN0eWxlLndpZHRoID0gXCJcIjtcbiAgICAgICAgICB0aGlzLm1lbnVFbHQuc3R5bGUuZGlzcGxheSA9IFwiXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGJvcmRlciA9ICh0aGlzLnBtLndyYXBwZXIub2Zmc2V0V2lkdGggLSB0aGlzLnBtLndyYXBwZXIuY2xpZW50V2lkdGgpIC8gMjtcbiAgICAgICAgICB0aGlzLm1lbnVFbHQuc3R5bGUubGVmdCA9IGVkaXRvclJlY3QubGVmdCArIGJvcmRlciArIFwicHhcIjtcbiAgICAgICAgICB0aGlzLm1lbnVFbHQuc3R5bGUuZGlzcGxheSA9IGVkaXRvclJlY3QudG9wID4gd2luZG93LmlubmVySGVpZ2h0ID8gXCJub25lXCIgOiBcIlwiO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZWRpdG9yUmVjdC50b3AgPCAwICYmIGVkaXRvclJlY3QuYm90dG9tID49IHRoaXMubWVudUVsdC5vZmZzZXRIZWlnaHQgKyAxMCkge1xuICAgICAgICAgIHRoaXMuZmxvYXRpbmcgPSB0cnVlO1xuICAgICAgICAgIHZhciBtZW51UmVjdCA9IHRoaXMubWVudUVsdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICB0aGlzLm1lbnVFbHQuc3R5bGUubGVmdCA9IG1lbnVSZWN0LmxlZnQgKyBcInB4XCI7XG4gICAgICAgICAgdGhpcy5tZW51RWx0LnN0eWxlLndpZHRoID0gbWVudVJlY3Qud2lkdGggKyBcInB4XCI7XG4gICAgICAgICAgdGhpcy5tZW51RWx0LnN0eWxlLnBvc2l0aW9uID0gXCJmaXhlZFwiO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInByZXBhcmVTY3JvbGxDdXJzb3JcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcHJlcGFyZVNjcm9sbEN1cnNvcigpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICBpZiAoIXRoaXMuZmxvYXRpbmcpIHJldHVybiBudWxsO1xuICAgICAgdmFyIGhlYWQgPSB0aGlzLnBtLnNlbGVjdGlvbi5oZWFkO1xuICAgICAgaWYgKCFoZWFkKSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciBjdXJzb3JQb3MgPSB0aGlzLnBtLmNvb3Jkc0F0UG9zKGhlYWQpO1xuICAgICAgdmFyIG1lbnVSZWN0ID0gdGhpcy5tZW51RWx0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgaWYgKGN1cnNvclBvcy50b3AgPCBtZW51UmVjdC5ib3R0b20gJiYgY3Vyc29yUG9zLmJvdHRvbSA+IG1lbnVSZWN0LnRvcCkge1xuICAgICAgICB2YXIgX3JldCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIHNjcm9sbGFibGUgPSBmaW5kV3JhcHBpbmdTY3JvbGxhYmxlKF90aGlzMy5wbS53cmFwcGVyKTtcbiAgICAgICAgICBpZiAoc2Nyb2xsYWJsZSkgcmV0dXJuIHtcbiAgICAgICAgICAgICAgdjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzY3JvbGxhYmxlLnNjcm9sbFRvcCAtPSBtZW51UmVjdC5ib3R0b20gLSBjdXJzb3JQb3MudG9wO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KSgpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgX3JldCA9PT0gXCJvYmplY3RcIikgcmV0dXJuIF9yZXQudjtcbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gTWVudUJhcjtcbn0pKCk7XG5cbmZ1bmN0aW9uIGZpbmRXcmFwcGluZ1Njcm9sbGFibGUobm9kZSkge1xuICBmb3IgKHZhciBjdXIgPSBub2RlLnBhcmVudE5vZGU7IGN1cjsgY3VyID0gY3VyLnBhcmVudE5vZGUpIHtcbiAgICBpZiAoY3VyLnNjcm9sbEhlaWdodCA+IGN1ci5jbGllbnRIZWlnaHQpIHJldHVybiBjdXI7XG4gIH1cbn1cblxuKDAsIF9kb20uaW5zZXJ0Q1NTKShcIlxcbi5Qcm9zZU1pcnJvci1tZW51YmFyIHtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIG1hcmdpbi1ib3R0b206IDNweDtcXG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IGluaGVyaXQ7XFxuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogaW5oZXJpdDtcXG59XFxuXFxuLlByb3NlTWlycm9yLW1lbnViYXItaW5uZXIge1xcbiAgY29sb3I6ICM2NjY7XFxuICBwYWRkaW5nOiAxcHggNnB4O1xcbiAgdG9wOiAwOyBsZWZ0OiAwOyByaWdodDogMDtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBzaWx2ZXI7XFxuICBiYWNrZ3JvdW5kOiB3aGl0ZTtcXG4gIHotaW5kZXg6IDEwO1xcbiAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxuICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiBpbmhlcml0O1xcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IGluaGVyaXQ7XFxufVxcblxcbi5Qcm9zZU1pcnJvci1tZW51YmFyIC5Qcm9zZU1pcnJvci1pY29uLWFjdGl2ZSB7XFxuICBiYWNrZ3JvdW5kOiAjZWVlO1xcbn1cXG5cXG4uUHJvc2VNaXJyb3ItbWVudWJhciBpbnB1dFt0eXBlPVxcXCJ0ZXh0XFxcIl0sXFxuLlByb3NlTWlycm9yLW1lbnViYXIgdGV4dGFyZWEge1xcbiAgYmFja2dyb3VuZDogI2VlZTtcXG4gIGNvbG9yOiBibGFjaztcXG4gIGJvcmRlcjogbm9uZTtcXG4gIG91dGxpbmU6IG5vbmU7XFxuICB3aWR0aDogMTAwJTtcXG4gIGJveC1zaXppbmc6IC1tb3otYm9yZGVyLWJveDtcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxufVxcblxcbi5Qcm9zZU1pcnJvci1tZW51YmFyIGlucHV0W3R5cGU9XFxcInRleHRcXFwiXSB7XFxuICBwYWRkaW5nOiAwIDRweDtcXG59XFxuXFxuLlByb3NlTWlycm9yLW1lbnViYXIgZm9ybSB7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICBwYWRkaW5nOiAycHggNHB4O1xcbn1cXG5cXG4uUHJvc2VNaXJyb3ItbWVudWJhciAuUHJvc2VNaXJyb3ItYmxvY2t0eXBlIHtcXG4gIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XFxuICBtaW4td2lkdGg6IDRlbTtcXG59XFxuLlByb3NlTWlycm9yLW1lbnViYXIgLlByb3NlTWlycm9yLWJsb2NrdHlwZTphZnRlciB7XFxuICBjb2xvcjogI2NjYztcXG59XFxuXFxuLlByb3NlTWlycm9yLW1lbnViYXItc2xpZGluZyB7XFxuICAtd2Via2l0LXRyYW5zaXRpb246IGxlZnQgMC4ycyBlYXNlLW91dDtcXG4gIC1tb3otdHJhbnNpdGlvbjogbGVmdCAwLjJzIGVhc2Utb3V0O1xcbiAgdHJhbnNpdGlvbjogbGVmdCAwLjJzIGVhc2Utb3V0O1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgbGVmdDogMTAwJTtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgYm94LXNpemluZzogLW1vei1ib3JkZXItYm94O1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gIHBhZGRpbmctbGVmdDogMTZweDtcXG4gIGJhY2tncm91bmQ6IHdoaXRlO1xcbn1cXG5cXG4uUHJvc2VNaXJyb3ItbWVudWJhci1iYWNrIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGhlaWdodDogMTAwJTtcXG4gIG1hcmdpbi10b3A6IC0xcHg7XFxuICBwYWRkaW5nLWJvdHRvbTogMnB4O1xcbiAgd2lkdGg6IDEwcHg7XFxuICBsZWZ0OiAwO1xcbiAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgc2lsdmVyO1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXG4uUHJvc2VNaXJyb3ItbWVudWJhci1iYWNrOmFmdGVyIHtcXG4gIGNvbnRlbnQ6IFxcXCLCq1xcXCI7XFxufVxcblxcblwiKTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgX2RvbSA9IHJlcXVpcmUoXCIuLi9kb21cIik7XG5cbnZhciBwcmVmaXggPSBcIlByb3NlTWlycm9yLXRvb2x0aXBcIjtcblxudmFyIFRvb2x0aXAgPSAoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBUb29sdGlwKHBtLCBkaXIpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRvb2x0aXApO1xuXG4gICAgdGhpcy5wbSA9IHBtO1xuICAgIHRoaXMuZGlyID0gZGlyIHx8IFwiYWJvdmVcIjtcbiAgICB0aGlzLnBvaW50ZXIgPSBwbS53cmFwcGVyLmFwcGVuZENoaWxkKCgwLCBfZG9tLmVsdCkoXCJkaXZcIiwgeyBcImNsYXNzXCI6IHByZWZpeCArIFwiLXBvaW50ZXItXCIgKyB0aGlzLmRpciArIFwiIFwiICsgcHJlZml4ICsgXCItcG9pbnRlclwiIH0pKTtcbiAgICB0aGlzLnBvaW50ZXJXaWR0aCA9IHRoaXMucG9pbnRlckhlaWdodCA9IG51bGw7XG4gICAgdGhpcy5kb20gPSBwbS53cmFwcGVyLmFwcGVuZENoaWxkKCgwLCBfZG9tLmVsdCkoXCJkaXZcIiwgeyBcImNsYXNzXCI6IHByZWZpeCB9KSk7XG4gICAgdGhpcy5kb20uYWRkRXZlbnRMaXN0ZW5lcihcInRyYW5zaXRpb25lbmRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLmRvbS5zdHlsZS5vcGFjaXR5ID09IFwiMFwiKSBfdGhpcy5kb20uc3R5bGUuZGlzcGxheSA9IF90aGlzLnBvaW50ZXIuc3R5bGUuZGlzcGxheSA9IFwiXCI7XG4gICAgfSk7XG5cbiAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgIHRoaXMubGFzdExlZnQgPSB0aGlzLmxhc3RSaWdodCA9IG51bGw7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoVG9vbHRpcCwgW3tcbiAgICBrZXk6IFwiZGV0YWNoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRldGFjaCgpIHtcbiAgICAgIHRoaXMuZG9tLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kb20pO1xuICAgICAgdGhpcy5wb2ludGVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5wb2ludGVyKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0U2l6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRTaXplKG5vZGUpIHtcbiAgICAgIHZhciB3cmFwID0gdGhpcy5wbS53cmFwcGVyLmFwcGVuZENoaWxkKCgwLCBfZG9tLmVsdCkoXCJkaXZcIiwge1xuICAgICAgICBcImNsYXNzXCI6IHByZWZpeCxcbiAgICAgICAgc3R5bGU6IFwiZGlzcGxheTogYmxvY2s7IHBvc2l0aW9uOiBhYnNvbHV0ZVwiXG4gICAgICB9LCBub2RlKSk7XG4gICAgICB2YXIgc2l6ZSA9IHsgd2lkdGg6IHdyYXAub2Zmc2V0V2lkdGgsIGhlaWdodDogd3JhcC5vZmZzZXRIZWlnaHQgfTtcbiAgICAgIHdyYXAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh3cmFwKTtcbiAgICAgIHJldHVybiBzaXplO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJvcGVuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9wZW4obm9kZSwgcG9zKSB7XG4gICAgICB2YXIgbGVmdCA9IHRoaXMubGFzdExlZnQgPSBwb3MgPyBwb3MubGVmdCA6IHRoaXMubGFzdExlZnQ7XG4gICAgICB2YXIgdG9wID0gdGhpcy5sYXN0VG9wID0gcG9zID8gcG9zLnRvcCA6IHRoaXMubGFzdFRvcDtcblxuICAgICAgdmFyIHNpemUgPSB0aGlzLmdldFNpemUobm9kZSk7XG5cbiAgICAgIHZhciBhcm91bmQgPSB0aGlzLnBtLndyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgIGZvciAodmFyIGNoaWxkID0gdGhpcy5kb20uZmlyc3RDaGlsZCwgbmV4dCA9IHVuZGVmaW5lZDsgY2hpbGQ7IGNoaWxkID0gbmV4dCkge1xuICAgICAgICBuZXh0ID0gY2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgIGlmIChjaGlsZCAhPSB0aGlzLnBvaW50ZXIpIHRoaXMuZG9tLnJlbW92ZUNoaWxkKGNoaWxkKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZG9tLmFwcGVuZENoaWxkKG5vZGUpO1xuXG4gICAgICB0aGlzLmRvbS5zdHlsZS5kaXNwbGF5ID0gdGhpcy5wb2ludGVyLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG5cbiAgICAgIGlmICh0aGlzLnBvaW50ZXJXaWR0aCA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMucG9pbnRlcldpZHRoID0gdGhpcy5wb2ludGVyLm9mZnNldFdpZHRoIC0gMTtcbiAgICAgICAgdGhpcy5wb2ludGVySGVpZ2h0ID0gdGhpcy5wb2ludGVyLm9mZnNldEhlaWdodCAtIDE7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZG9tLnN0eWxlLndpZHRoID0gc2l6ZS53aWR0aCArIFwicHhcIjtcbiAgICAgIHRoaXMuZG9tLnN0eWxlLmhlaWdodCA9IHNpemUuaGVpZ2h0ICsgXCJweFwiO1xuXG4gICAgICB2YXIgbWFyZ2luID0gNTtcbiAgICAgIGlmICh0aGlzLmRpciA9PSBcImFib3ZlXCIgfHwgdGhpcy5kaXIgPT0gXCJiZWxvd1wiKSB7XG4gICAgICAgIHZhciB0aXBMZWZ0ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4obGVmdCAtIHNpemUud2lkdGggLyAyLCB3aW5kb3cuaW5uZXJXaWR0aCAtIHNpemUud2lkdGgpKTtcbiAgICAgICAgdGhpcy5kb20uc3R5bGUubGVmdCA9IHRpcExlZnQgLSBhcm91bmQubGVmdCArIFwicHhcIjtcbiAgICAgICAgdGhpcy5wb2ludGVyLnN0eWxlLmxlZnQgPSBsZWZ0IC0gYXJvdW5kLmxlZnQgLSB0aGlzLnBvaW50ZXJXaWR0aCAvIDIgKyBcInB4XCI7XG4gICAgICAgIGlmICh0aGlzLmRpciA9PSBcImFib3ZlXCIpIHtcbiAgICAgICAgICB2YXIgdGlwVG9wID0gdG9wIC0gYXJvdW5kLnRvcCAtIG1hcmdpbiAtIHRoaXMucG9pbnRlckhlaWdodCAtIHNpemUuaGVpZ2h0O1xuICAgICAgICAgIHRoaXMuZG9tLnN0eWxlLnRvcCA9IHRpcFRvcCArIFwicHhcIjtcbiAgICAgICAgICB0aGlzLnBvaW50ZXIuc3R5bGUudG9wID0gdGlwVG9wICsgc2l6ZS5oZWlnaHQgKyBcInB4XCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gYmVsb3dcbiAgICAgICAgICB2YXIgdGlwVG9wID0gdG9wIC0gYXJvdW5kLnRvcCArIG1hcmdpbjtcbiAgICAgICAgICB0aGlzLnBvaW50ZXIuc3R5bGUudG9wID0gdGlwVG9wICsgXCJweFwiO1xuICAgICAgICAgIHRoaXMuZG9tLnN0eWxlLnRvcCA9IHRpcFRvcCArIHRoaXMucG9pbnRlckhlaWdodCArIFwicHhcIjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmRpciA9PSBcImxlZnRcIiB8fCB0aGlzLmRpciA9PSBcInJpZ2h0XCIpIHtcbiAgICAgICAgdGhpcy5kb20uc3R5bGUudG9wID0gdG9wIC0gYXJvdW5kLnRvcCAtIHNpemUuaGVpZ2h0IC8gMiArIFwicHhcIjtcbiAgICAgICAgdGhpcy5wb2ludGVyLnN0eWxlLnRvcCA9IHRvcCAtIHRoaXMucG9pbnRlckhlaWdodCAvIDIgLSBhcm91bmQudG9wICsgXCJweFwiO1xuICAgICAgICBpZiAodGhpcy5kaXIgPT0gXCJsZWZ0XCIpIHtcbiAgICAgICAgICB2YXIgcG9pbnRlckxlZnQgPSBsZWZ0IC0gYXJvdW5kLmxlZnQgLSBtYXJnaW4gLSB0aGlzLnBvaW50ZXJXaWR0aDtcbiAgICAgICAgICB0aGlzLmRvbS5zdHlsZS5sZWZ0ID0gcG9pbnRlckxlZnQgLSBzaXplLndpZHRoICsgXCJweFwiO1xuICAgICAgICAgIHRoaXMucG9pbnRlci5zdHlsZS5sZWZ0ID0gcG9pbnRlckxlZnQgKyBcInB4XCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gcmlnaHRcbiAgICAgICAgICB2YXIgcG9pbnRlckxlZnQgPSBsZWZ0IC0gYXJvdW5kLmxlZnQgKyBtYXJnaW47XG4gICAgICAgICAgdGhpcy5kb20uc3R5bGUubGVmdCA9IHBvaW50ZXJMZWZ0ICsgdGhpcy5wb2ludGVyV2lkdGggKyBcInB4XCI7XG4gICAgICAgICAgdGhpcy5wb2ludGVyLnN0eWxlLmxlZnQgPSBwb2ludGVyTGVmdCArIFwicHhcIjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmRpciA9PSBcImNlbnRlclwiKSB7XG4gICAgICAgIHZhciBfdG9wID0gTWF0aC5tYXgoYXJvdW5kLnRvcCwgMCksXG4gICAgICAgICAgICBib3R0b20gPSBNYXRoLm1pbihhcm91bmQuYm90dG9tLCB3aW5kb3cuaW5uZXJIZWlnaHQpO1xuICAgICAgICB2YXIgZnJvbVRvcCA9IChib3R0b20gLSBfdG9wIC0gc2l6ZS5oZWlnaHQpIC8gMjtcbiAgICAgICAgdGhpcy5kb20uc3R5bGUubGVmdCA9IChhcm91bmQud2lkdGggLSBzaXplLndpZHRoKSAvIDIgKyBcInB4XCI7XG4gICAgICAgIHRoaXMuZG9tLnN0eWxlLnRvcCA9IF90b3AgLSBhcm91bmQudG9wICsgZnJvbVRvcCArIFwicHhcIjtcbiAgICAgIH1cblxuICAgICAgZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmRvbSkub3BhY2l0eTtcbiAgICAgIGdldENvbXB1dGVkU3R5bGUodGhpcy5wb2ludGVyKS5vcGFjaXR5O1xuICAgICAgdGhpcy5kb20uc3R5bGUub3BhY2l0eSA9IHRoaXMucG9pbnRlci5zdHlsZS5vcGFjaXR5ID0gMTtcbiAgICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY2xvc2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2xvc2UoKSB7XG4gICAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kb20uc3R5bGUub3BhY2l0eSA9IHRoaXMucG9pbnRlci5zdHlsZS5vcGFjaXR5ID0gMDtcbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gVG9vbHRpcDtcbn0pKCk7XG5cbmV4cG9ydHMuVG9vbHRpcCA9IFRvb2x0aXA7XG5cbigwLCBfZG9tLmluc2VydENTUykoXCJcXG5cXG4uUHJvc2VNaXJyb3ItdG9vbHRpcCB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBkaXNwbGF5OiBub25lO1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gIC1tb3otYm94LXNpemluZzogYm9yZGVyLSBib3g7XFxuICBvdmVyZmxvdzogaGlkZGVuO1xcblxcbiAgLXdlYmtpdC10cmFuc2l0aW9uOiB3aWR0aCAwLjRzIGVhc2Utb3V0LCBoZWlnaHQgMC40cyBlYXNlLW91dCwgbGVmdCAwLjRzIGVhc2Utb3V0LCB0b3AgMC40cyBlYXNlLW91dCwgb3BhY2l0eSAwLjJzO1xcbiAgLW1vei10cmFuc2l0aW9uOiB3aWR0aCAwLjRzIGVhc2Utb3V0LCBoZWlnaHQgMC40cyBlYXNlLW91dCwgbGVmdCAwLjRzIGVhc2Utb3V0LCB0b3AgMC40cyBlYXNlLW91dCwgb3BhY2l0eSAwLjJzO1xcbiAgdHJhbnNpdGlvbjogd2lkdGggMC40cyBlYXNlLW91dCwgaGVpZ2h0IDAuNHMgZWFzZS1vdXQsIGxlZnQgMC40cyBlYXNlLW91dCwgdG9wIDAuNHMgZWFzZS1vdXQsIG9wYWNpdHkgMC4ycztcXG4gIG9wYWNpdHk6IDA7XFxuXFxuICBib3JkZXItcmFkaXVzOiA1cHg7XFxuICBwYWRkaW5nOiAzcHggN3B4O1xcbiAgbWFyZ2luOiAwO1xcbiAgYmFja2dyb3VuZDogIzQ0NDtcXG4gIGJvcmRlci1jb2xvcjogIzc3NztcXG4gIGNvbG9yOiB3aGl0ZTtcXG5cXG4gIHotaW5kZXg6IDU7XFxufVxcblxcbi5Qcm9zZU1pcnJvci10b29sdGlwLXBvaW50ZXIge1xcbiAgY29udGVudDogXFxcIlxcXCI7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBkaXNwbGF5OiBub25lO1xcbiAgd2lkdGg6IDA7IGhlaWdodDogMDtcXG5cXG4gIC13ZWJraXQtdHJhbnNpdGlvbjogbGVmdCAwLjRzIGVhc2Utb3V0LCB0b3AgMC40cyBlYXNlLW91dCwgb3BhY2l0eSAwLjJzO1xcbiAgLW1vei10cmFuc2l0aW9uOiBsZWZ0IDAuNHMgZWFzZS1vdXQsIHRvcCAwLjRzIGVhc2Utb3V0LCBvcGFjaXR5IDAuMnM7XFxuICB0cmFuc2l0aW9uOiBsZWZ0IDAuNHMgZWFzZS1vdXQsIHRvcCAwLjRzIGVhc2Utb3V0LCBvcGFjaXR5IDAuMnM7XFxuICBvcGFjaXR5OiAwO1xcblxcbiAgei1pbmRleDogMTA7XFxufVxcblxcbi5Qcm9zZU1pcnJvci10b29sdGlwLXBvaW50ZXItYWJvdmUge1xcbiAgYm9yZGVyLWxlZnQ6IDZweCBzb2xpZCB0cmFuc3BhcmVudDtcXG4gIGJvcmRlci1yaWdodDogNnB4IHNvbGlkIHRyYW5zcGFyZW50O1xcbiAgYm9yZGVyLXRvcDogNnB4IHNvbGlkICM0NDQ7XFxufVxcblxcbi5Qcm9zZU1pcnJvci10b29sdGlwLXBvaW50ZXItYmVsb3cge1xcbiAgYm9yZGVyLWxlZnQ6IDZweCBzb2xpZCB0cmFuc3BhcmVudDtcXG4gIGJvcmRlci1yaWdodDogNnB4IHNvbGlkIHRyYW5zcGFyZW50O1xcbiAgYm9yZGVyLWJvdHRvbTogNnB4IHNvbGlkICM0NDQ7XFxufVxcblxcbi5Qcm9zZU1pcnJvci10b29sdGlwLXBvaW50ZXItcmlnaHQge1xcbiAgYm9yZGVyLXRvcDogNnB4IHNvbGlkIHRyYW5zcGFyZW50O1xcbiAgYm9yZGVyLWJvdHRvbTogNnB4IHNvbGlkIHRyYW5zcGFyZW50O1xcbiAgYm9yZGVyLXJpZ2h0OiA2cHggc29saWQgIzQ0NDtcXG59XFxuXFxuLlByb3NlTWlycm9yLXRvb2x0aXAtcG9pbnRlci1sZWZ0IHtcXG4gIGJvcmRlci10b3A6IDZweCBzb2xpZCB0cmFuc3BhcmVudDtcXG4gIGJvcmRlci1ib3R0b206IDZweCBzb2xpZCB0cmFuc3BhcmVudDtcXG4gIGJvcmRlci1sZWZ0OiA2cHggc29saWQgIzQ0NDtcXG59XFxuXFxuLlByb3NlTWlycm9yLXRvb2x0aXAgaW5wdXRbdHlwZT1cXFwidGV4dFxcXCJdLFxcbi5Qcm9zZU1pcnJvci10b29sdGlwIHRleHRhcmVhIHtcXG4gIGJhY2tncm91bmQ6ICM2NjY7XFxuICBjb2xvcjogd2hpdGU7XFxuICBib3JkZXI6IG5vbmU7XFxuICBvdXRsaW5lOiBub25lO1xcbn1cXG5cXG4uUHJvc2VNaXJyb3ItdG9vbHRpcCBpbnB1dFt0eXBlPVxcXCJ0ZXh0XFxcIl0ge1xcbiAgcGFkZGluZzogMCA0cHg7XFxufVxcblxcblwiKTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgX21vZGVsID0gcmVxdWlyZShcIi4uL21vZGVsXCIpO1xuXG52YXIgX2VkaXQgPSByZXF1aXJlKFwiLi4vZWRpdFwiKTtcblxudmFyIF9kb20gPSByZXF1aXJlKFwiLi4vZG9tXCIpO1xuXG52YXIgX3VwZGF0ZSA9IHJlcXVpcmUoXCIuL3VwZGF0ZVwiKTtcblxudmFyIF90b29sdGlwID0gcmVxdWlyZShcIi4vdG9vbHRpcFwiKTtcblxudmFyIF9tZW51ID0gcmVxdWlyZShcIi4vbWVudVwiKTtcblxudmFyIGNsYXNzUHJlZml4ID0gXCJQcm9zZU1pcnJvci10b29sdGlwbWVudVwiO1xuXG4oMCwgX2VkaXQuZGVmaW5lT3B0aW9uKShcInRvb2x0aXBNZW51XCIsIGZhbHNlLCBmdW5jdGlvbiAocG0sIHZhbHVlKSB7XG4gIGlmIChwbS5tb2QudG9vbHRpcE1lbnUpIHBtLm1vZC50b29sdGlwTWVudS5kZXRhY2goKTtcbiAgcG0ubW9kLnRvb2x0aXBNZW51ID0gdmFsdWUgPyBuZXcgVG9vbHRpcE1lbnUocG0sIHZhbHVlKSA6IG51bGw7XG59KTtcblxudmFyIFRvb2x0aXBNZW51ID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gVG9vbHRpcE1lbnUocG0sIGNvbmZpZykge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVG9vbHRpcE1lbnUpO1xuXG4gICAgdGhpcy5wbSA9IHBtO1xuICAgIHRoaXMuaW5saW5lSXRlbXMgPSBjb25maWcgJiYgY29uZmlnLmlubGluZUl0ZW1zIHx8ICgwLCBfbWVudS5jb21tYW5kR3JvdXBzKShwbSwgXCJpbmxpbmVcIik7XG4gICAgdGhpcy5ibG9ja0l0ZW1zID0gY29uZmlnICYmIGNvbmZpZy5ibG9ja0l0ZW1zIHx8ICgwLCBfbWVudS5jb21tYW5kR3JvdXBzKShwbSwgXCJibG9ja1wiKTtcbiAgICB0aGlzLnNob3dMaW5rcyA9IGNvbmZpZyA/IGNvbmZpZy5zaG93TGlua3MgIT09IGZhbHNlIDogdHJ1ZTtcbiAgICB0aGlzLnNlbGVjdGVkQmxvY2tNZW51ID0gY29uZmlnICYmIGNvbmZpZy5zZWxlY3RlZEJsb2NrTWVudTtcbiAgICB0aGlzLnVwZGF0ZSA9IG5ldyBfdXBkYXRlLk1lbnVVcGRhdGUocG0sIFwiY2hhbmdlIHNlbGVjdGlvbkNoYW5nZSBibHVyXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdGhpcy5wcmVwYXJlVXBkYXRlKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnRvb2x0aXAgPSBuZXcgX3Rvb2x0aXAuVG9vbHRpcChwbSwgXCJhYm92ZVwiKTtcbiAgICB0aGlzLm1lbnUgPSBuZXcgX21lbnUuTWVudShwbSwgbmV3IF9tZW51LlRvb2x0aXBEaXNwbGF5KHRoaXMudG9vbHRpcCwgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLnVwZGF0ZS5mb3JjZSgpO1xuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHggYW5kIHkgY29vcmRpbmF0ZXMgYXQgdGhlIHRvcCBjZW50ZXIgb2YgdGhlIGN1cnJlbnQgRE9NIHNlbGVjdGlvbi5cbiAgICpcbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKi9cblxuICBfY3JlYXRlQ2xhc3MoVG9vbHRpcE1lbnUsIFt7XG4gICAga2V5OiBcImRldGFjaFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZXRhY2goKSB7XG4gICAgICB0aGlzLnVwZGF0ZS5kZXRhY2goKTtcbiAgICAgIHRoaXMudG9vbHRpcC5kZXRhY2goKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicHJlcGFyZVVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwcmVwYXJlVXBkYXRlKCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLm1lbnUuYWN0aXZlKSByZXR1cm4gbnVsbDtcblxuICAgICAgdmFyIF9wbSRzZWxlY3Rpb24gPSB0aGlzLnBtLnNlbGVjdGlvbjtcbiAgICAgIHZhciBlbXB0eSA9IF9wbSRzZWxlY3Rpb24uZW1wdHk7XG4gICAgICB2YXIgbm9kZSA9IF9wbSRzZWxlY3Rpb24ubm9kZTtcbiAgICAgIHZhciBmcm9tID0gX3BtJHNlbGVjdGlvbi5mcm9tO1xuICAgICAgdmFyIHRvID0gX3BtJHNlbGVjdGlvbi50bzt2YXIgbGluayA9IHVuZGVmaW5lZDtcbiAgICAgIGlmICghdGhpcy5wbS5oYXNGb2N1cygpKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMi50b29sdGlwLmNsb3NlKCk7XG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKG5vZGUgJiYgbm9kZS5pc0Jsb2NrKSB7XG4gICAgICAgIHZhciBfcmV0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgY29vcmRzID0gdG9wT2ZOb2RlU2VsZWN0aW9uKF90aGlzMi5wbSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHY6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMi5tZW51LnNob3coX3RoaXMyLmJsb2NrSXRlbXMsIGNvb3Jkcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfSkoKTtcblxuICAgICAgICBpZiAodHlwZW9mIF9yZXQgPT09IFwib2JqZWN0XCIpIHJldHVybiBfcmV0LnY7XG4gICAgICB9IGVsc2UgaWYgKCFlbXB0eSkge1xuICAgICAgICB2YXIgX3JldDIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBjb29yZHMgPSBub2RlID8gdG9wT2ZOb2RlU2VsZWN0aW9uKF90aGlzMi5wbSkgOiB0b3BDZW50ZXJPZlNlbGVjdGlvbigpO1xuICAgICAgICAgIHZhciBzaG93QmxvY2sgPSBfdGhpczIuc2VsZWN0ZWRCbG9ja01lbnUgJiYgX21vZGVsLlBvcy5zYW1lUGF0aChmcm9tLnBhdGgsIHRvLnBhdGgpICYmIGZyb20ub2Zmc2V0ID09IDAgJiYgdG8ub2Zmc2V0ID09IF90aGlzMi5wbS5kb2MucGF0aChmcm9tLnBhdGgpLnNpemU7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHY6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMi5tZW51LnNob3coc2hvd0Jsb2NrID8gW190aGlzMi5pbmxpbmVJdGVtcywgX3RoaXMyLmJsb2NrSXRlbXNdIDogX3RoaXMyLmlubGluZUl0ZW1zLCBjb29yZHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH0pKCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBfcmV0MiA9PT0gXCJvYmplY3RcIikgcmV0dXJuIF9yZXQyLnY7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRCbG9ja01lbnUgJiYgdGhpcy5wbS5kb2MucGF0aChmcm9tLnBhdGgpLnNpemUgPT0gMCkge1xuICAgICAgICB2YXIgX3JldDMgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBjb29yZHMgPSBfdGhpczIucG0uY29vcmRzQXRQb3MoZnJvbSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHY6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMi5tZW51LnNob3coX3RoaXMyLmJsb2NrSXRlbXMsIGNvb3Jkcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfSkoKTtcblxuICAgICAgICBpZiAodHlwZW9mIF9yZXQzID09PSBcIm9iamVjdFwiKSByZXR1cm4gX3JldDMudjtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zaG93TGlua3MgJiYgKGxpbmsgPSB0aGlzLmxpbmtVbmRlckN1cnNvcigpKSkge1xuICAgICAgICB2YXIgX3JldDQgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBjb29yZHMgPSBfdGhpczIucG0uY29vcmRzQXRQb3MoZnJvbSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHY6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMi5zaG93TGluayhsaW5rLCBjb29yZHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH0pKCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBfcmV0NCA9PT0gXCJvYmplY3RcIikgcmV0dXJuIF9yZXQ0LnY7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBfdGhpczIudG9vbHRpcC5jbG9zZSgpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJsaW5rVW5kZXJDdXJzb3JcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbGlua1VuZGVyQ3Vyc29yKCkge1xuICAgICAgdmFyIGhlYWQgPSB0aGlzLnBtLnNlbGVjdGlvbi5oZWFkO1xuICAgICAgaWYgKCFoZWFkKSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciBtYXJrcyA9IHRoaXMucG0uZG9jLm1hcmtzQXQoaGVhZCk7XG4gICAgICByZXR1cm4gbWFya3MucmVkdWNlKGZ1bmN0aW9uIChmb3VuZCwgbSkge1xuICAgICAgICByZXR1cm4gZm91bmQgfHwgbS50eXBlLm5hbWUgPT0gXCJsaW5rXCIgJiYgbTtcbiAgICAgIH0sIG51bGwpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzaG93TGlua1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaG93TGluayhsaW5rLCBwb3MpIHtcbiAgICAgIHZhciBub2RlID0gKDAsIF9kb20uZWx0KShcImRpdlwiLCB7IFwiY2xhc3NcIjogY2xhc3NQcmVmaXggKyBcIi1saW5rdGV4dFwiIH0sICgwLCBfZG9tLmVsdCkoXCJhXCIsIHsgaHJlZjogbGluay5hdHRycy5ocmVmLCB0aXRsZTogbGluay5hdHRycy50aXRsZSB9LCBsaW5rLmF0dHJzLmhyZWYpKTtcbiAgICAgIHRoaXMudG9vbHRpcC5vcGVuKG5vZGUsIHBvcyk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFRvb2x0aXBNZW51O1xufSkoKTtcblxuZnVuY3Rpb24gdG9wQ2VudGVyT2ZTZWxlY3Rpb24oKSB7XG4gIHZhciByZWN0cyA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKS5nZXRSYW5nZUF0KDApLmdldENsaWVudFJlY3RzKCk7XG4gIHZhciBfcmVjdHMkMCA9IHJlY3RzWzBdO1xuICB2YXIgbGVmdCA9IF9yZWN0cyQwLmxlZnQ7XG4gIHZhciByaWdodCA9IF9yZWN0cyQwLnJpZ2h0O1xuICB2YXIgdG9wID0gX3JlY3RzJDAudG9wO3ZhciBpID0gMTtcbiAgd2hpbGUgKGxlZnQgPT0gcmlnaHQgJiYgcmVjdHMubGVuZ3RoID4gaSkge1xuICAgIDt2YXIgX3JlY3RzID0gcmVjdHNbaSsrXTtcbiAgICBsZWZ0ID0gX3JlY3RzLmxlZnQ7XG4gICAgcmlnaHQgPSBfcmVjdHMucmlnaHQ7XG4gICAgdG9wID0gX3JlY3RzLnRvcDtcbiAgfVxuICBmb3IgKDsgaSA8IHJlY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHJlY3RzW2ldLnRvcCA8IHJlY3RzWzBdLmJvdHRvbSAtIDEgJiYgKFxuICAgIC8vIENocm9tZSBidWcgd2hlcmUgYm9ndXMgcmVjdGFuZ2xlcyBhcmUgaW5zZXJ0ZWQgYXQgc3BhbiBib3VuZGFyaWVzXG4gICAgaSA9PSByZWN0cy5sZW5ndGggLSAxIHx8IE1hdGguYWJzKHJlY3RzW2kgKyAxXS5sZWZ0IC0gcmVjdHNbaV0ubGVmdCkgPiAxKSkge1xuICAgICAgbGVmdCA9IE1hdGgubWluKGxlZnQsIHJlY3RzW2ldLmxlZnQpO1xuICAgICAgcmlnaHQgPSBNYXRoLm1heChyaWdodCwgcmVjdHNbaV0ucmlnaHQpO1xuICAgICAgdG9wID0gTWF0aC5taW4odG9wLCByZWN0c1tpXS50b3ApO1xuICAgIH1cbiAgfVxuICByZXR1cm4geyB0b3A6IHRvcCwgbGVmdDogKGxlZnQgKyByaWdodCkgLyAyIH07XG59XG5cbmZ1bmN0aW9uIHRvcE9mTm9kZVNlbGVjdGlvbihwbSkge1xuICB2YXIgc2VsZWN0ZWQgPSBwbS5jb250ZW50LnF1ZXJ5U2VsZWN0b3IoXCIuUHJvc2VNaXJyb3Itc2VsZWN0ZWRub2RlXCIpO1xuICBpZiAoIXNlbGVjdGVkKSByZXR1cm4geyBsZWZ0OiAwLCB0b3A6IDAgfTtcbiAgdmFyIGJveCA9IHNlbGVjdGVkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICByZXR1cm4geyBsZWZ0OiBNYXRoLm1pbigoYm94LmxlZnQgKyBib3gucmlnaHQpIC8gMiwgYm94LmxlZnQgKyAyMCksIHRvcDogYm94LnRvcCB9O1xufVxuXG4oMCwgX2RvbS5pbnNlcnRDU1MpKFwiXFxuXFxuLlByb3NlTWlycm9yLXRvb2x0aXBtZW51LWxpbmt0ZXh0IGEge1xcbiAgY29sb3I6IHdoaXRlO1xcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xcbiAgcGFkZGluZzogMCA1cHg7XFxufVxcblxcbi5Qcm9zZU1pcnJvci10b29sdGlwbWVudS1saW5rdGV4dCBhOmhvdmVyIHtcXG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xcbn1cXG5cXG5cIik7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIE1JTl9GTFVTSF9ERUxBWSA9IDIwMDtcbnZhciBVUERBVEVfVElNRU9VVCA9IDIwMDtcblxudmFyIE1lbnVVcGRhdGUgPSAoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBNZW51VXBkYXRlKHBtLCBldmVudHMsIHByZXBhcmUpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE1lbnVVcGRhdGUpO1xuXG4gICAgdGhpcy5wbSA9IHBtO1xuICAgIHRoaXMucHJlcGFyZSA9IHByZXBhcmU7XG5cbiAgICB0aGlzLm11c3RVcGRhdGUgPSBmYWxzZTtcbiAgICB0aGlzLnVwZGF0ZUluZm8gPSBudWxsO1xuICAgIHRoaXMudGltZW91dCA9IG51bGw7XG4gICAgdGhpcy5sYXN0Rmx1c2ggPSAwO1xuXG4gICAgdGhpcy5ldmVudHMgPSBldmVudHMuc3BsaXQoXCIgXCIpO1xuICAgIHRoaXMub25FdmVudCA9IHRoaXMub25FdmVudC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZm9yY2UgPSB0aGlzLmZvcmNlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5ldmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIHJldHVybiBwbS5vbihldmVudCwgX3RoaXMub25FdmVudCk7XG4gICAgfSk7XG4gICAgcG0ub24oXCJmbHVzaFwiLCB0aGlzLm9uRmx1c2ggPSB0aGlzLm9uRmx1c2guYmluZCh0aGlzKSk7XG4gICAgcG0ub24oXCJmbHVzaGVkXCIsIHRoaXMub25GbHVzaGVkID0gdGhpcy5vbkZsdXNoZWQuYmluZCh0aGlzKSk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoTWVudVVwZGF0ZSwgW3tcbiAgICBrZXk6IFwiZGV0YWNoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRldGFjaCgpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTtcbiAgICAgIHRoaXMuZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHJldHVybiBfdGhpczIucG0ub2ZmKGV2ZW50LCBfdGhpczIub25FdmVudCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMucG0ub2ZmKFwiZmx1c2hcIiwgdGhpcy5vbkZsdXNoKTtcbiAgICAgIHRoaXMucG0ub2ZmKFwiZmx1c2hlZFwiLCB0aGlzLm9uRmx1c2hlZCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm9uRmx1c2hcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25GbHVzaCgpIHtcbiAgICAgIHZhciBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgaWYgKHRoaXMubXVzdFVwZGF0ZSAmJiBub3cgLSB0aGlzLmxhc3RGbHVzaCA+PSBNSU5fRkxVU0hfREVMQVkpIHtcbiAgICAgICAgdGhpcy5sYXN0Rmx1c2ggPSBub3c7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpO1xuICAgICAgICB0aGlzLm11c3RVcGRhdGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy51cGRhdGUgPSB0aGlzLnByZXBhcmUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwib25GbHVzaGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uRmx1c2hlZCgpIHtcbiAgICAgIGlmICh0aGlzLnVwZGF0ZSkge1xuICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICB0aGlzLnVwZGF0ZSA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm9uRXZlbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25FdmVudCgpIHtcbiAgICAgIHRoaXMubXVzdFVwZGF0ZSA9IHRydWU7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTtcbiAgICAgIHRoaXMudGltZW91dCA9IHNldFRpbWVvdXQodGhpcy5mb3JjZSwgVVBEQVRFX1RJTUVPVVQpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJmb3JjZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmb3JjZSgpIHtcbiAgICAgIGlmICh0aGlzLnBtLm9wZXJhdGlvbikge1xuICAgICAgICB0aGlzLm9uRXZlbnQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubXVzdFVwZGF0ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnVwZGF0ZUluZm8gPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3RGbHVzaCA9IERhdGUubm93KCk7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpO1xuICAgICAgICB2YXIgdXBkYXRlID0gdGhpcy5wcmVwYXJlKCk7XG4gICAgICAgIGlmICh1cGRhdGUpIHVwZGF0ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBNZW51VXBkYXRlO1xufSkoKTtcblxuZXhwb3J0cy5NZW51VXBkYXRlID0gTWVudVVwZGF0ZTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG52YXIgX2dldCA9IGZ1bmN0aW9uIGdldChfeCwgX3gyLCBfeDMpIHsgdmFyIF9hZ2FpbiA9IHRydWU7IF9mdW5jdGlvbjogd2hpbGUgKF9hZ2FpbikgeyB2YXIgb2JqZWN0ID0gX3gsIHByb3BlcnR5ID0gX3gyLCByZWNlaXZlciA9IF94MzsgX2FnYWluID0gZmFsc2U7IGlmIChvYmplY3QgPT09IG51bGwpIG9iamVjdCA9IEZ1bmN0aW9uLnByb3RvdHlwZTsgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpOyBpZiAoZGVzYyA9PT0gdW5kZWZpbmVkKSB7IHZhciBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTsgaWYgKHBhcmVudCA9PT0gbnVsbCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IGVsc2UgeyBfeCA9IHBhcmVudDsgX3gyID0gcHJvcGVydHk7IF94MyA9IHJlY2VpdmVyOyBfYWdhaW4gPSB0cnVlOyBkZXNjID0gcGFyZW50ID0gdW5kZWZpbmVkOyBjb250aW51ZSBfZnVuY3Rpb247IH0gfSBlbHNlIGlmIChcInZhbHVlXCIgaW4gZGVzYykgeyByZXR1cm4gZGVzYy52YWx1ZTsgfSBlbHNlIHsgdmFyIGdldHRlciA9IGRlc2MuZ2V0OyBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSByZXR1cm4gZ2V0dGVyLmNhbGwocmVjZWl2ZXIpOyB9IH0gfTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbnZhciBfc2NoZW1hID0gcmVxdWlyZShcIi4vc2NoZW1hXCIpO1xuXG4vLyA7OyAjdG9jPVwiRGVmYXVsdCBzY2hlbWFcIiBUaGUgZGVmYXVsdCB0b3AtbGV2ZWwgZG9jdW1lbnQgbm9kZSB0eXBlLlxuXG52YXIgRG9jID0gKGZ1bmN0aW9uIChfQmxvY2spIHtcbiAgX2luaGVyaXRzKERvYywgX0Jsb2NrKTtcblxuICBmdW5jdGlvbiBEb2MoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIERvYyk7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihEb2MucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgLy8gOzsgI3RvYz1mYWxzZSBUaGUgZGVmYXVsdCBibG9ja3F1b3RlIG5vZGUgdHlwZS5cblxuICBfY3JlYXRlQ2xhc3MoRG9jLCBudWxsLCBbe1xuICAgIGtleTogXCJraW5kXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gXCIuXCI7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIERvYztcbn0pKF9zY2hlbWEuQmxvY2spO1xuXG5leHBvcnRzLkRvYyA9IERvYztcblxudmFyIEJsb2NrUXVvdGUgPSAoZnVuY3Rpb24gKF9CbG9jazIpIHtcbiAgX2luaGVyaXRzKEJsb2NrUXVvdGUsIF9CbG9jazIpO1xuXG4gIGZ1bmN0aW9uIEJsb2NrUXVvdGUoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEJsb2NrUXVvdGUpO1xuXG4gICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoQmxvY2tRdW90ZS5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICAvLyA7OyAjdG9jPWZhbHNlIFRoZSBkZWZhdWx0IG9yZGVyZWQgbGlzdCBub2RlIHR5cGUuIEhhcyBhIHNpbmdsZSBhdHRyaWJ1dGUsXG4gIC8vIGBvcmRlcmAsIHdoaWNoIGRldGVybWluZXMgdGhlIG51bWJlciBhdCB3aGljaCB0aGUgbGlzdCBzdGFydHNcbiAgLy8gY291bnRpbmcsIGFuZCBkZWZhdWx0cyB0byAxLlxuICByZXR1cm4gQmxvY2tRdW90ZTtcbn0pKF9zY2hlbWEuQmxvY2spO1xuXG5leHBvcnRzLkJsb2NrUXVvdGUgPSBCbG9ja1F1b3RlO1xuXG52YXIgT3JkZXJlZExpc3QgPSAoZnVuY3Rpb24gKF9CbG9jazMpIHtcbiAgX2luaGVyaXRzKE9yZGVyZWRMaXN0LCBfQmxvY2szKTtcblxuICBmdW5jdGlvbiBPcmRlcmVkTGlzdCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgT3JkZXJlZExpc3QpO1xuXG4gICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoT3JkZXJlZExpc3QucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKE9yZGVyZWRMaXN0LCBudWxsLCBbe1xuICAgIGtleTogXCJjb250YWluc1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIFwibGlzdF9pdGVtXCI7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIE9yZGVyZWRMaXN0O1xufSkoX3NjaGVtYS5CbG9jayk7XG5cbmV4cG9ydHMuT3JkZXJlZExpc3QgPSBPcmRlcmVkTGlzdDtcblxuT3JkZXJlZExpc3QuYXR0cmlidXRlcyA9IHsgb3JkZXI6IG5ldyBfc2NoZW1hLkF0dHJpYnV0ZSh7IFwiZGVmYXVsdFwiOiBcIjFcIiB9KSB9O1xuXG4vLyA7OyAjdG9jPWZhbHNlIFRoZSBkZWZhdWx0IGJ1bGxldCBsaXN0IG5vZGUgdHlwZS5cblxudmFyIEJ1bGxldExpc3QgPSAoZnVuY3Rpb24gKF9CbG9jazQpIHtcbiAgX2luaGVyaXRzKEJ1bGxldExpc3QsIF9CbG9jazQpO1xuXG4gIGZ1bmN0aW9uIEJ1bGxldExpc3QoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEJ1bGxldExpc3QpO1xuXG4gICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoQnVsbGV0TGlzdC5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICAvLyA7OyAjdG9jPWZhbHNlIFRoZSBkZWZhdWx0IGxpc3QgaXRlbSBub2RlIHR5cGUuXG5cbiAgX2NyZWF0ZUNsYXNzKEJ1bGxldExpc3QsIG51bGwsIFt7XG4gICAga2V5OiBcImNvbnRhaW5zXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gXCJsaXN0X2l0ZW1cIjtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQnVsbGV0TGlzdDtcbn0pKF9zY2hlbWEuQmxvY2spO1xuXG5leHBvcnRzLkJ1bGxldExpc3QgPSBCdWxsZXRMaXN0O1xuXG52YXIgTGlzdEl0ZW0gPSAoZnVuY3Rpb24gKF9CbG9jazUpIHtcbiAgX2luaGVyaXRzKExpc3RJdGVtLCBfQmxvY2s1KTtcblxuICBmdW5jdGlvbiBMaXN0SXRlbSgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTGlzdEl0ZW0pO1xuXG4gICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoTGlzdEl0ZW0ucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgLy8gOzsgI3RvYz1mYWxzZSBUaGUgZGVmYXVsdCBob3Jpem9udGFsIHJ1bGUgbm9kZSB0eXBlLlxuXG4gIF9jcmVhdGVDbGFzcyhMaXN0SXRlbSwgbnVsbCwgW3tcbiAgICBrZXk6IFwia2luZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIFwiLlwiO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBMaXN0SXRlbTtcbn0pKF9zY2hlbWEuQmxvY2spO1xuXG5leHBvcnRzLkxpc3RJdGVtID0gTGlzdEl0ZW07XG5cbnZhciBIb3Jpem9udGFsUnVsZSA9IChmdW5jdGlvbiAoX0Jsb2NrNikge1xuICBfaW5oZXJpdHMoSG9yaXpvbnRhbFJ1bGUsIF9CbG9jazYpO1xuXG4gIGZ1bmN0aW9uIEhvcml6b250YWxSdWxlKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBIb3Jpem9udGFsUnVsZSk7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihIb3Jpem9udGFsUnVsZS5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICAvLyA7OyAjdG9jPWZhbHNlIFRoZSBkZWZhdWx0IGhlYWRpbmcgbm9kZSB0eXBlLiBIYXMgYSBzaW5nbGUgYXR0cmlidXRlXG4gIC8vIGBsZXZlbGAsIHdoaWNoIGluZGljYXRlcyB0aGUgaGVhZGluZyBsZXZlbCwgYW5kIGRlZmF1bHRzIHRvIDEuXG5cbiAgX2NyZWF0ZUNsYXNzKEhvcml6b250YWxSdWxlLCBudWxsLCBbe1xuICAgIGtleTogXCJjb250YWluc1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEhvcml6b250YWxSdWxlO1xufSkoX3NjaGVtYS5CbG9jayk7XG5cbmV4cG9ydHMuSG9yaXpvbnRhbFJ1bGUgPSBIb3Jpem9udGFsUnVsZTtcblxudmFyIEhlYWRpbmcgPSAoZnVuY3Rpb24gKF9UZXh0YmxvY2spIHtcbiAgX2luaGVyaXRzKEhlYWRpbmcsIF9UZXh0YmxvY2spO1xuXG4gIGZ1bmN0aW9uIEhlYWRpbmcoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEhlYWRpbmcpO1xuXG4gICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoSGVhZGluZy5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gSGVhZGluZztcbn0pKF9zY2hlbWEuVGV4dGJsb2NrKTtcblxuZXhwb3J0cy5IZWFkaW5nID0gSGVhZGluZztcblxuSGVhZGluZy5hdHRyaWJ1dGVzID0geyBsZXZlbDogbmV3IF9zY2hlbWEuQXR0cmlidXRlKHsgXCJkZWZhdWx0XCI6IFwiMVwiIH0pIH07XG5cbi8vIDs7ICN0b2M9ZmFsc2UgVGhlIGRlZmF1bHQgY29kZSBibG9jayAvIGxpc3Rpbmcgbm9kZSB0eXBlLiBPbmx5XG4vLyBhbGxvd3MgdW5tYXJrZWQgdGV4dCBub2RlcyBpbnNpZGUgb2YgaXQuXG5cbnZhciBDb2RlQmxvY2sgPSAoZnVuY3Rpb24gKF9UZXh0YmxvY2syKSB7XG4gIF9pbmhlcml0cyhDb2RlQmxvY2ssIF9UZXh0YmxvY2syKTtcblxuICBmdW5jdGlvbiBDb2RlQmxvY2soKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENvZGVCbG9jayk7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihDb2RlQmxvY2sucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgLy8gOzsgI3RvYz1mYWxzZSBUaGUgZGVmYXVsdCBwYXJhZ3JhcGggbm9kZSB0eXBlLlxuXG4gIF9jcmVhdGVDbGFzcyhDb2RlQmxvY2ssIFt7XG4gICAga2V5OiBcImNvbnRhaW5zTWFya3NcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNDb2RlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogXCJjb250YWluc1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIFwidGV4dFwiO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBDb2RlQmxvY2s7XG59KShfc2NoZW1hLlRleHRibG9jayk7XG5cbmV4cG9ydHMuQ29kZUJsb2NrID0gQ29kZUJsb2NrO1xuXG52YXIgUGFyYWdyYXBoID0gKGZ1bmN0aW9uIChfVGV4dGJsb2NrMykge1xuICBfaW5oZXJpdHMoUGFyYWdyYXBoLCBfVGV4dGJsb2NrMyk7XG5cbiAgZnVuY3Rpb24gUGFyYWdyYXBoKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQYXJhZ3JhcGgpO1xuXG4gICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoUGFyYWdyYXBoLnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIC8vIDs7ICN0b2M9ZmFsc2UgVGhlIGRlZmF1bHQgaW5saW5lIGltYWdlIG5vZGUgdHlwZS4gSGFzIHRoZXNlXG4gIC8vIGF0dHJpYnV0ZXM6XG4gIC8vXG4gIC8vIC0gKipgc3JjYCoqIChyZXF1aXJlZCk6IFRoZSBVUkwgb2YgdGhlIGltYWdlLlxuICAvLyAtICoqYGFsdGAqKjogVGhlIGFsdCB0ZXh0LlxuICAvLyAtICoqYHRpdGxlYCoqOiBUaGUgdGl0bGUgb2YgdGhlIGltYWdlLlxuXG4gIF9jcmVhdGVDbGFzcyhQYXJhZ3JhcGgsIFt7XG4gICAga2V5OiBcImRlZmF1bHRUZXh0YmxvY2tcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBQYXJhZ3JhcGg7XG59KShfc2NoZW1hLlRleHRibG9jayk7XG5cbmV4cG9ydHMuUGFyYWdyYXBoID0gUGFyYWdyYXBoO1xuXG52YXIgSW1hZ2UgPSAoZnVuY3Rpb24gKF9JbmxpbmUpIHtcbiAgX2luaGVyaXRzKEltYWdlLCBfSW5saW5lKTtcblxuICBmdW5jdGlvbiBJbWFnZSgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgSW1hZ2UpO1xuXG4gICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoSW1hZ2UucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgcmV0dXJuIEltYWdlO1xufSkoX3NjaGVtYS5JbmxpbmUpO1xuXG5leHBvcnRzLkltYWdlID0gSW1hZ2U7XG5cbkltYWdlLmF0dHJpYnV0ZXMgPSB7XG4gIHNyYzogbmV3IF9zY2hlbWEuQXR0cmlidXRlKCksXG4gIGFsdDogbmV3IF9zY2hlbWEuQXR0cmlidXRlKHsgXCJkZWZhdWx0XCI6IFwiXCIgfSksXG4gIHRpdGxlOiBuZXcgX3NjaGVtYS5BdHRyaWJ1dGUoeyBcImRlZmF1bHRcIjogXCJcIiB9KVxufTtcblxuLy8gOzsgI3RvYz1mYWxzZSBUaGUgZGVmYXVsdCBoYXJkIGJyZWFrIG5vZGUgdHlwZS5cblxudmFyIEhhcmRCcmVhayA9IChmdW5jdGlvbiAoX0lubGluZTIpIHtcbiAgX2luaGVyaXRzKEhhcmRCcmVhaywgX0lubGluZTIpO1xuXG4gIGZ1bmN0aW9uIEhhcmRCcmVhaygpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgSGFyZEJyZWFrKTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKEhhcmRCcmVhay5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICAvLyA7OyAjdG9jPWZhbHNlIFRoZSBkZWZhdWx0IGVtcGhhc2lzIG1hcmsgdHlwZS5cblxuICBfY3JlYXRlQ2xhc3MoSGFyZEJyZWFrLCBbe1xuICAgIGtleTogXCJzZWxlY3RhYmxlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImlzQlJcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBIYXJkQnJlYWs7XG59KShfc2NoZW1hLklubGluZSk7XG5cbmV4cG9ydHMuSGFyZEJyZWFrID0gSGFyZEJyZWFrO1xuXG52YXIgRW1NYXJrID0gKGZ1bmN0aW9uIChfTWFya1R5cGUpIHtcbiAgX2luaGVyaXRzKEVtTWFyaywgX01hcmtUeXBlKTtcblxuICBmdW5jdGlvbiBFbU1hcmsoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEVtTWFyayk7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihFbU1hcmsucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgLy8gOzsgI3RvYz1mYWxzZSBUaGUgZGVmYXVsdCBzdHJvbmcgbWFyayB0eXBlLlxuXG4gIF9jcmVhdGVDbGFzcyhFbU1hcmssIG51bGwsIFt7XG4gICAga2V5OiBcInJhbmtcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiA1MTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRW1NYXJrO1xufSkoX3NjaGVtYS5NYXJrVHlwZSk7XG5cbmV4cG9ydHMuRW1NYXJrID0gRW1NYXJrO1xuXG52YXIgU3Ryb25nTWFyayA9IChmdW5jdGlvbiAoX01hcmtUeXBlMikge1xuICBfaW5oZXJpdHMoU3Ryb25nTWFyaywgX01hcmtUeXBlMik7XG5cbiAgZnVuY3Rpb24gU3Ryb25nTWFyaygpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU3Ryb25nTWFyayk7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihTdHJvbmdNYXJrLnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIC8vIDs7ICN0b2M9ZmFsc2UgVGhlIGRlZmF1bHQgbGluayBtYXJrIHR5cGUuIEhhcyB0aGVzZSBhdHRyaWJ1dGVzOlxuICAvL1xuICAvLyAtICoqYGhyZWZgKiogKHJlcXVpcmVkKTogVGhlIGxpbmsgdGFyZ2V0LlxuICAvLyAtICoqYHRpdGxlYCoqOiBUaGUgbGluaydzIHRpdGxlLlxuXG4gIF9jcmVhdGVDbGFzcyhTdHJvbmdNYXJrLCBudWxsLCBbe1xuICAgIGtleTogXCJyYW5rXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gNTI7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFN0cm9uZ01hcms7XG59KShfc2NoZW1hLk1hcmtUeXBlKTtcblxuZXhwb3J0cy5TdHJvbmdNYXJrID0gU3Ryb25nTWFyaztcblxudmFyIExpbmtNYXJrID0gKGZ1bmN0aW9uIChfTWFya1R5cGUzKSB7XG4gIF9pbmhlcml0cyhMaW5rTWFyaywgX01hcmtUeXBlMyk7XG5cbiAgZnVuY3Rpb24gTGlua01hcmsoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIExpbmtNYXJrKTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKExpbmtNYXJrLnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhMaW5rTWFyaywgbnVsbCwgW3tcbiAgICBrZXk6IFwicmFua1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIDUzO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBMaW5rTWFyaztcbn0pKF9zY2hlbWEuTWFya1R5cGUpO1xuXG5leHBvcnRzLkxpbmtNYXJrID0gTGlua01hcms7XG5cbkxpbmtNYXJrLmF0dHJpYnV0ZXMgPSB7XG4gIGhyZWY6IG5ldyBfc2NoZW1hLkF0dHJpYnV0ZSgpLFxuICB0aXRsZTogbmV3IF9zY2hlbWEuQXR0cmlidXRlKHsgXCJkZWZhdWx0XCI6IFwiXCIgfSlcbn07XG5cbi8vIDs7ICN0b2M9ZmFsc2UgVGhlIGRlZmF1bHQgY29kZSBmb250IG1hcmsgdHlwZS5cblxudmFyIENvZGVNYXJrID0gKGZ1bmN0aW9uIChfTWFya1R5cGU0KSB7XG4gIF9pbmhlcml0cyhDb2RlTWFyaywgX01hcmtUeXBlNCk7XG5cbiAgZnVuY3Rpb24gQ29kZU1hcmsoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENvZGVNYXJrKTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKENvZGVNYXJrLnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIC8vIDo6IFNjaGVtYVNwZWNcbiAgLy8gVGhlIHNwZWNpZmljYXRpb24gZm9yIHRoZSBkZWZhdWx0IHNjaGVtYS5cblxuICBfY3JlYXRlQ2xhc3MoQ29kZU1hcmssIFt7XG4gICAga2V5OiBcImlzQ29kZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwicmFua1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIDEwMTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQ29kZU1hcms7XG59KShfc2NoZW1hLk1hcmtUeXBlKTtcblxuZXhwb3J0cy5Db2RlTWFyayA9IENvZGVNYXJrO1xudmFyIGRlZmF1bHRTcGVjID0gbmV3IF9zY2hlbWEuU2NoZW1hU3BlYyh7XG4gIGRvYzogRG9jLFxuICBibG9ja3F1b3RlOiBCbG9ja1F1b3RlLFxuICBvcmRlcmVkX2xpc3Q6IE9yZGVyZWRMaXN0LFxuICBidWxsZXRfbGlzdDogQnVsbGV0TGlzdCxcbiAgbGlzdF9pdGVtOiBMaXN0SXRlbSxcbiAgaG9yaXpvbnRhbF9ydWxlOiBIb3Jpem9udGFsUnVsZSxcblxuICBwYXJhZ3JhcGg6IFBhcmFncmFwaCxcbiAgaGVhZGluZzogSGVhZGluZyxcbiAgY29kZV9ibG9jazogQ29kZUJsb2NrLFxuXG4gIHRleHQ6IF9zY2hlbWEuVGV4dCxcbiAgaW1hZ2U6IEltYWdlLFxuICBoYXJkX2JyZWFrOiBIYXJkQnJlYWtcbn0sIHtcbiAgZW06IEVtTWFyayxcbiAgc3Ryb25nOiBTdHJvbmdNYXJrLFxuICBsaW5rOiBMaW5rTWFyayxcbiAgY29kZTogQ29kZU1hcmtcbn0pO1xuXG4vLyA6OiBTY2hlbWFcbi8vIFByb3NlTWlycm9yJ3MgZGVmYXVsdCBkb2N1bWVudCBzY2hlbWEuXG52YXIgZGVmYXVsdFNjaGVtYSA9IG5ldyBfc2NoZW1hLlNjaGVtYShkZWZhdWx0U3BlYyk7XG5leHBvcnRzLmRlZmF1bHRTY2hlbWEgPSBkZWZhdWx0U2NoZW1hOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5maW5kRGlmZlN0YXJ0ID0gZmluZERpZmZTdGFydDtcbmV4cG9ydHMuZmluZERpZmZFbmQgPSBmaW5kRGlmZkVuZDtcblxudmFyIF9wb3MgPSByZXF1aXJlKFwiLi9wb3NcIik7XG5cbi8vIDo6IChOb2RlLCBOb2RlKSDihpIgP1Bvc1xuLy8gRmluZCB0aGUgZmlyc3QgcG9zaXRpb24gYXQgd2hpY2ggbm9kZXMgYGFgIGFuZCBgYmAgZGlmZmVyLCBvclxuLy8gYG51bGxgIGlmIHRoZXkgYXJlIHRoZSBzYW1lLlxuXG5mdW5jdGlvbiBmaW5kRGlmZlN0YXJ0KGEsIGIpIHtcbiAgdmFyIHBhdGggPSBhcmd1bWVudHMubGVuZ3RoIDw9IDIgfHwgYXJndW1lbnRzWzJdID09PSB1bmRlZmluZWQgPyBbXSA6IGFyZ3VtZW50c1syXTtcblxuICB2YXIgaUEgPSBhLml0ZXIoKSxcbiAgICAgIGlCID0gYi5pdGVyKCksXG4gICAgICBvZmZzZXQgPSAwO1xuICBmb3IgKDs7KSB7XG4gICAgaWYgKGlBLmF0RW5kKCkgfHwgaUIuYXRFbmQoKSkge1xuICAgICAgaWYgKGEuc2l6ZSA9PSBiLnNpemUpIHJldHVybiBudWxsO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdmFyIGNoaWxkQSA9IGlBLm5leHQoKSxcbiAgICAgICAgY2hpbGRCID0gaUIubmV4dCgpO1xuICAgIGlmIChjaGlsZEEgPT0gY2hpbGRCKSB7XG4gICAgICBvZmZzZXQgKz0gY2hpbGRBLndpZHRoO2NvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICghY2hpbGRBLnNhbWVNYXJrdXAoY2hpbGRCKSkgYnJlYWs7XG5cbiAgICBpZiAoY2hpbGRBLmlzVGV4dCAmJiBjaGlsZEEudGV4dCAhPSBjaGlsZEIudGV4dCkge1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGNoaWxkQS50ZXh0W2pdID09IGNoaWxkQi50ZXh0W2pdOyBqKyspIHtcbiAgICAgICAgb2Zmc2V0Kys7XG4gICAgICB9YnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKGNoaWxkQS5zaXplIHx8IGNoaWxkQi5zaXplKSB7XG4gICAgICBwYXRoLnB1c2gob2Zmc2V0KTtcbiAgICAgIHZhciBpbm5lciA9IGZpbmREaWZmU3RhcnQoY2hpbGRBLmNvbnRlbnQsIGNoaWxkQi5jb250ZW50LCBwYXRoKTtcbiAgICAgIGlmIChpbm5lcikgcmV0dXJuIGlubmVyO1xuICAgICAgcGF0aC5wb3AoKTtcbiAgICB9XG4gICAgb2Zmc2V0ICs9IGNoaWxkQS53aWR0aDtcbiAgfVxuICByZXR1cm4gbmV3IF9wb3MuUG9zKHBhdGgsIG9mZnNldCk7XG59XG5cbi8vIDo6IChOb2RlLCBOb2RlKSDihpIgP3thOiBQb3MsIGI6IFBvc31cbi8vIEZpbmQgdGhlIGZpcnN0IHBvc2l0aW9uLCBzZWFyY2hpbmcgZnJvbSB0aGUgZW5kLCBhdCB3aGljaCBub2RlcyBgYWBcbi8vIGFuZCBgYmAgZGlmZmVyLCBvciBgbnVsbGAgaWYgdGhleSBhcmUgdGhlIHNhbWUuIFNpbmNlIHRoaXMgcG9zaXRpb25cbi8vIHdpbGwgbm90IGJlIHRoZSBzYW1lIGluIGJvdGggbm9kZXMsIGFuIG9iamVjdCB3aXRoIHR3byBzZXBhcmF0ZVxuLy8gcG9zaXRpb25zIGlzIHJldHVybmVkLlxuXG5mdW5jdGlvbiBmaW5kRGlmZkVuZChhLCBiKSB7XG4gIHZhciBwYXRoQSA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMiB8fCBhcmd1bWVudHNbMl0gPT09IHVuZGVmaW5lZCA/IFtdIDogYXJndW1lbnRzWzJdO1xuICB2YXIgcGF0aEIgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDMgfHwgYXJndW1lbnRzWzNdID09PSB1bmRlZmluZWQgPyBbXSA6IGFyZ3VtZW50c1szXTtcblxuICB2YXIgaUEgPSBhLnJldmVyc2VJdGVyKCksXG4gICAgICBpQiA9IGIucmV2ZXJzZUl0ZXIoKTtcbiAgdmFyIG9mZkEgPSBhLnNpemUsXG4gICAgICBvZmZCID0gYi5zaXplO1xuXG4gIGZvciAoOzspIHtcbiAgICBpZiAoaUEuYXRFbmQoKSB8fCBpQi5hdEVuZCgpKSB7XG4gICAgICBpZiAoYS5zaXplID09IGIuc2l6ZSkgcmV0dXJuIG51bGw7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgdmFyIGNoaWxkQSA9IGlBLm5leHQoKSxcbiAgICAgICAgY2hpbGRCID0gaUIubmV4dCgpO1xuICAgIGlmIChjaGlsZEEgPT0gY2hpbGRCKSB7XG4gICAgICBvZmZBIC09IGNoaWxkQS53aWR0aDtvZmZCIC09IGNoaWxkQi53aWR0aDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICghY2hpbGRBLnNhbWVNYXJrdXAoY2hpbGRCKSkgYnJlYWs7XG5cbiAgICBpZiAoY2hpbGRBLmlzVGV4dCAmJiBjaGlsZEEudGV4dCAhPSBjaGlsZEIudGV4dCkge1xuICAgICAgdmFyIHNhbWUgPSAwLFxuICAgICAgICAgIG1pblNpemUgPSBNYXRoLm1pbihjaGlsZEEudGV4dC5sZW5ndGgsIGNoaWxkQi50ZXh0Lmxlbmd0aCk7XG4gICAgICB3aGlsZSAoc2FtZSA8IG1pblNpemUgJiYgY2hpbGRBLnRleHRbY2hpbGRBLnRleHQubGVuZ3RoIC0gc2FtZSAtIDFdID09IGNoaWxkQi50ZXh0W2NoaWxkQi50ZXh0Lmxlbmd0aCAtIHNhbWUgLSAxXSkge1xuICAgICAgICBzYW1lKys7b2ZmQS0tO29mZkItLTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBvZmZBIC09IGNoaWxkQS53aWR0aDtvZmZCIC09IGNoaWxkQi53aWR0aDtcbiAgICBpZiAoY2hpbGRBLnNpemUgfHwgY2hpbGRCLnNpemUpIHtcbiAgICAgIHBhdGhBLnB1c2gob2ZmQSk7cGF0aEIucHVzaChvZmZCKTtcbiAgICAgIHZhciBpbm5lciA9IGZpbmREaWZmRW5kKGNoaWxkQS5jb250ZW50LCBjaGlsZEIuY29udGVudCwgcGF0aEEsIHBhdGhCKTtcbiAgICAgIGlmIChpbm5lcikgcmV0dXJuIGlubmVyO1xuICAgICAgcGF0aEEucG9wKCk7cGF0aEIucG9wKCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IGE6IG5ldyBfcG9zLlBvcyhwYXRoQSwgb2ZmQSksIGI6IG5ldyBfcG9zLlBvcyhwYXRoQiwgb2ZmQikgfTtcbn0iLCIvLyA7OyBBIGZyYWdtZW50IGlzIGFuIGFic3RyYWN0IHR5cGUgdXNlZCB0byByZXByZXNlbnQgYSBub2RlJ3Ncbi8vIGNvbGxlY3Rpb24gb2YgY2hpbGQgbm9kZXMuIEl0IHRyaWVzIHRvIGhpZGUgY29uc2lkZXJhdGlvbnMgYWJvdXRcbi8vIHRoZSBhY3R1YWwgd2F5IGluIHdoaWNoIHRoZSBjaGlsZCBub2RlcyBhcmUgc3RvcmVkLCBzbyB0aGF0XG4vLyBkaWZmZXJlbnQgcmVwcmVzZW50YXRpb25zIChub2RlcyB0aGF0IG9ubHkgY29udGFpbiBzaW1wbGUgbm9kZXNcbi8vIHZlcnN1cyBub2RlcyB0aGF0IGFsc28gY29udGFpbiB0ZXh0KSBjYW4gYmUgYXBwcm9hY2hlZCB1c2luZyB0aGVcbi8vIHNhbWUgQVBJLlxuLy9cbi8vIEZyYWdtZW50cyBhcmUgcGVyc2lzdGVudCBkYXRhIHN0cnVjdHVyZXMuIFRoYXQgbWVhbnMgeW91IHNob3VsZFxuLy8gX25vdF8gbXV0YXRlIHRoZW0gb3IgdGhlaXIgY29udGVudCwgYnV0IGNyZWF0ZSBuZXcgaW5zdGFuY2VzXG4vLyB3aGVuZXZlciBuZWVkZWQuIFRoZSBBUEkgdHJpZXMgdG8gbWFrZSB0aGlzIGVhc3kuXG5cInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9nZXQgPSBmdW5jdGlvbiBnZXQoX3gxNiwgX3gxNywgX3gxOCkgeyB2YXIgX2FnYWluID0gdHJ1ZTsgX2Z1bmN0aW9uOiB3aGlsZSAoX2FnYWluKSB7IHZhciBvYmplY3QgPSBfeDE2LCBwcm9wZXJ0eSA9IF94MTcsIHJlY2VpdmVyID0gX3gxODsgX2FnYWluID0gZmFsc2U7IGlmIChvYmplY3QgPT09IG51bGwpIG9iamVjdCA9IEZ1bmN0aW9uLnByb3RvdHlwZTsgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpOyBpZiAoZGVzYyA9PT0gdW5kZWZpbmVkKSB7IHZhciBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTsgaWYgKHBhcmVudCA9PT0gbnVsbCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IGVsc2UgeyBfeDE2ID0gcGFyZW50OyBfeDE3ID0gcHJvcGVydHk7IF94MTggPSByZWNlaXZlcjsgX2FnYWluID0gdHJ1ZTsgZGVzYyA9IHBhcmVudCA9IHVuZGVmaW5lZDsgY29udGludWUgX2Z1bmN0aW9uOyB9IH0gZWxzZSBpZiAoXCJ2YWx1ZVwiIGluIGRlc2MpIHsgcmV0dXJuIGRlc2MudmFsdWU7IH0gZWxzZSB7IHZhciBnZXR0ZXIgPSBkZXNjLmdldDsgaWYgKGdldHRlciA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gcmV0dXJuIGdldHRlci5jYWxsKHJlY2VpdmVyKTsgfSB9IH07XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBGcmFnbWVudCA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEZyYWdtZW50KCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBGcmFnbWVudCk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoRnJhZ21lbnQsIFt7XG4gICAga2V5OiBcImFwcGVuZFwiLFxuXG4gICAgLy8gOjogKEZyYWdtZW50LCBudW1iZXIsIG51bWJlcikg4oaSIEZyYWdtZW50XG4gICAgLy8gQ3JlYXRlIGEgZnJhZ21lbnQgdGhhdCBjb21iaW5lcyB0aGlzIG9uZSB3aXRoIGFub3RoZXIgZnJhZ21lbnQuXG4gICAgLy8gVGFrZXMgY2FyZSBvZiBtZXJnaW5nIGFkamFjZW50IHRleHQgbm9kZXMgYW5kIGNhbiBhbHNvIG1lcmdlXG4gICAgLy8g4oCcb3BlbuKAnSBub2RlcyBhdCB0aGUgYm91bmRhcnkuIGBqb2luTGVmdGAgYW5kIGBqb2luUmlnaHRgIGdpdmUgdGhlXG4gICAgLy8gZGVwdGggdG8gd2hpY2ggdGhlIGxlZnQgYW5kIHJpZ2h0IGZyYWdtZW50cyBhcmUgb3Blbi4gSWYgb3BlblxuICAgIC8vIG5vZGVzIHdpdGggdGhlIHNhbWUgbWFya3VwIGFyZSBmb3VuZCBvbiBib3RoIHNpZGVzLCB0aGV5IGFyZVxuICAgIC8vIGpvaW5lZC4gSWYgbm90LCB0aGUgb3BlbiBub2RlcyBhcmUgW2Nsb3NlZF0oI05vZGUuY2xvc2UpLlxuICAgIHZhbHVlOiBmdW5jdGlvbiBhcHBlbmQob3RoZXIpIHtcbiAgICAgIHZhciBqb2luTGVmdCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IDAgOiBhcmd1bWVudHNbMV07XG4gICAgICB2YXIgam9pblJpZ2h0ID0gYXJndW1lbnRzLmxlbmd0aCA8PSAyIHx8IGFyZ3VtZW50c1syXSA9PT0gdW5kZWZpbmVkID8gMCA6IGFyZ3VtZW50c1syXTtcblxuICAgICAgaWYgKCF0aGlzLnNpemUpIHJldHVybiBqb2luUmlnaHQgPyBvdGhlci5yZXBsYWNlKDAsIG90aGVyLmZpcnN0Q2hpbGQuY2xvc2Uoam9pblJpZ2h0IC0gMSwgXCJzdGFydFwiKSkgOiBvdGhlcjtcbiAgICAgIGlmICghb3RoZXIuc2l6ZSkgcmV0dXJuIGpvaW5MZWZ0ID8gdGhpcy5yZXBsYWNlKHRoaXMuc2l6ZSAtIDEsIHRoaXMubGFzdENoaWxkLmNsb3NlKGpvaW5MZWZ0IC0gMSwgXCJlbmRcIikpIDogdGhpcztcbiAgICAgIHJldHVybiB0aGlzLmFwcGVuZElubmVyKG90aGVyLCBqb2luTGVmdCwgam9pblJpZ2h0KTtcbiAgICB9XG5cbiAgICAvLyA6OiBzdHJpbmdcbiAgICAvLyBDb25jYXRlbmF0ZSBhbGwgdGhlIHRleHQgbm9kZXMgZm91bmQgaW4gdGhpcyBmcmFnbWVudCBhbmQgaXRzXG4gICAgLy8gY2hpbGRyZW4uXG4gIH0sIHtcbiAgICBrZXk6IFwidG9TdHJpbmdcIixcblxuICAgIC8vIDo6ICgpIOKGkiBzdHJpbmdcbiAgICAvLyBSZXR1cm4gYSBkZWJ1Z2dpbmcgc3RyaW5nIHRoYXQgZGVzY3JpYmVzIHRoaXMgZnJhZ21lbnQuXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgdmFyIHN0ciA9IFwiXCI7XG4gICAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgcmV0dXJuIHN0ciArPSAoc3RyID8gXCIsIFwiIDogXCJcIikgKyBuLnRvU3RyaW5nKCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgLy8gOjogKG51bWJlciwgbnVtYmVyLCA/KE5vZGUpIOKGkiBOb2RlKSDihpIgW05vZGVdXG4gICAgLy8gUHJvZHVjZSBhbiBhcnJheSB3aXRoIHRoZSBjaGlsZCBub2RlcyBiZXR3ZWVuIHRoZSBnaXZlblxuICAgIC8vIGJvdW5kYXJpZXMsIG9wdGlvbmFsbHkgbWFwcGluZyBhIGZ1bmN0aW9uIG92ZXIgdGhlbS5cbiAgfSwge1xuICAgIGtleTogXCJ0b0FycmF5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvQXJyYXkoZnJvbSwgdG8sIGYpIHtcbiAgICAgIGlmIChmcm9tID09PSB1bmRlZmluZWQpIGZyb20gPSAwO1xuICAgICAgaWYgKHRvID09PSB1bmRlZmluZWQpIHRvID0gdGhpcy5zaXplO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICBmb3IgKHZhciBpdGVyID0gdGhpcy5pdGVyKGZyb20sIHRvKSwgbiA9IHVuZGVmaW5lZDsgbiA9IGl0ZXIubmV4dCgpLnZhbHVlOykge1xuICAgICAgICByZXN1bHQucHVzaChmID8gZihuKSA6IG4pO1xuICAgICAgfXJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8gOjogKChOb2RlKSDihpIgTm9kZSkg4oaSIEZyYWdtZW50XG4gICAgLy8gUHJvZHVjZSBhIG5ldyBGcmFnbWVudCBieSBtYXBwaW5nIGFsbCB0aGlzIGZyYWdtZW50J3MgY2hpbGRyZW5cbiAgICAvLyB0aHJvdWdoIGEgZnVuY3Rpb24uXG4gIH0sIHtcbiAgICBrZXk6IFwibWFwXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1hcChmKSB7XG4gICAgICAvLyBGSVhNRSBqb2luIHRleHQgbm9kZXM/XG4gICAgICByZXR1cm4gRnJhZ21lbnQuZnJvbUFycmF5KHRoaXMudG9BcnJheSh1bmRlZmluZWQsIHVuZGVmaW5lZCwgZikpO1xuICAgIH1cblxuICAgIC8vIDo6ICgoTm9kZSkg4oaSIGJvb2wpIOKGkiBib29sXG4gICAgLy8gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIGZ1bmN0aW9uIHJldHVybmVkIGB0cnVlYCBmb3IgYW55IG9mXG4gICAgLy8gdGhlIGZyYWdtZW50J3MgY2hpbGRyZW4uXG4gIH0sIHtcbiAgICBrZXk6IFwic29tZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzb21lKGYpIHtcbiAgICAgIGZvciAodmFyIGl0ZXIgPSB0aGlzLml0ZXIoKSwgbiA9IHVuZGVmaW5lZDsgbiA9IGl0ZXIubmV4dCgpLnZhbHVlOykge1xuICAgICAgICBpZiAoZihuKSkgcmV0dXJuIG47XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNsb3NlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNsb3NlKGRlcHRoLCBzaWRlKSB7XG4gICAgICB2YXIgY2hpbGQgPSBzaWRlID09IFwic3RhcnRcIiA/IHRoaXMuZmlyc3RDaGlsZCA6IHRoaXMubGFzdENoaWxkO1xuICAgICAgdmFyIGNsb3NlZCA9IGNoaWxkLmNsb3NlKGRlcHRoIC0gMSwgc2lkZSk7XG4gICAgICBpZiAoY2xvc2VkID09IGNoaWxkKSByZXR1cm4gdGhpcztcbiAgICAgIHJldHVybiB0aGlzLnJlcGxhY2Uoc2lkZSA9PSBcInN0YXJ0XCIgPyAwIDogdGhpcy5zaXplIC0gMSwgY2xvc2VkKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibm9kZXNCZXR3ZWVuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5vZGVzQmV0d2Vlbihmcm9tLCB0bywgZiwgcGF0aCwgcGFyZW50KSB7XG4gICAgICB2YXIgbW9yZUZyb20gPSBmcm9tICYmIGZyb20uZGVwdGggPiBwYXRoLmxlbmd0aCxcbiAgICAgICAgICBtb3JlVG8gPSB0byAmJiB0by5kZXB0aCA+IHBhdGgubGVuZ3RoO1xuICAgICAgdmFyIHN0YXJ0ID0gbW9yZUZyb20gPyBmcm9tLnBhdGhbcGF0aC5sZW5ndGhdIDogZnJvbSA/IGZyb20ub2Zmc2V0IDogMDtcbiAgICAgIHZhciBlbmQgPSBtb3JlVG8gPyB0by5wYXRoW3BhdGgubGVuZ3RoXSArIDEgOiB0byA/IHRvLm9mZnNldCA6IHRoaXMuc2l6ZTtcbiAgICAgIGZvciAodmFyIGl0ZXIgPSB0aGlzLml0ZXIoc3RhcnQsIGVuZCksIG5vZGUgPSB1bmRlZmluZWQ7IG5vZGUgPSBpdGVyLm5leHQoKS52YWx1ZTspIHtcbiAgICAgICAgdmFyIHN0YXJ0T2Zmc2V0ID0gaXRlci5vZmZzZXQgLSBub2RlLndpZHRoO1xuICAgICAgICBwYXRoLnB1c2goc3RhcnRPZmZzZXQpO1xuICAgICAgICBub2RlLm5vZGVzQmV0d2Vlbihtb3JlRnJvbSAmJiBzdGFydE9mZnNldCA9PSBzdGFydCA/IGZyb20gOiBudWxsLCBtb3JlVG8gJiYgaXRlci5vZmZzZXQgPT0gZW5kID8gdG8gOiBudWxsLCBmLCBwYXRoLCBwYXJlbnQpO1xuICAgICAgICBwYXRoLnBvcCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDo6ICg/UG9zLCA/UG9zKSDihpIgRnJhZ21lbnRcbiAgICAvLyBTbGljZSBvdXQgdGhlIHN1Yi1mcmFnbWVudCBiZXR3ZWVuIHRoZSB0d28gZ2l2ZW4gcG9zaXRpb25zLlxuICAgIC8vIGBudWxsYCBjYW4gYmUgcGFzc2VkIGZvciBlaXRoZXIgdG8gaW5kaWNhdGUgdGhlIHNsaWNlIHNob3VsZCBnb1xuICAgIC8vIGFsbCB0aGUgd2F5IHRvIHRoZSBzdGFydCBvciBlbmQgb2YgdGhlIGZyYWdtZW50LlxuICB9LCB7XG4gICAga2V5OiBcInNsaWNlQmV0d2VlblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzbGljZUJldHdlZW4oZnJvbSwgdG8pIHtcbiAgICAgIHZhciBkZXB0aCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMiB8fCBhcmd1bWVudHNbMl0gPT09IHVuZGVmaW5lZCA/IDAgOiBhcmd1bWVudHNbMl07XG5cbiAgICAgIHZhciBtb3JlRnJvbSA9IGZyb20gJiYgZnJvbS5kZXB0aCA+IGRlcHRoLFxuICAgICAgICAgIG1vcmVUbyA9IHRvICYmIHRvLmRlcHRoID4gZGVwdGg7XG4gICAgICB2YXIgc3RhcnQgPSBtb3JlRnJvbSA/IGZyb20ucGF0aFtkZXB0aF0gOiBmcm9tID8gZnJvbS5vZmZzZXQgOiAwO1xuICAgICAgdmFyIGVuZCA9IG1vcmVUbyA/IHRvLnBhdGhbZGVwdGhdICsgMSA6IHRvID8gdG8ub2Zmc2V0IDogdGhpcy5zaXplO1xuICAgICAgdmFyIG5vZGVzID0gW107XG4gICAgICBmb3IgKHZhciBpdGVyID0gdGhpcy5pdGVyKHN0YXJ0LCBlbmQpLCBub2RlID0gdW5kZWZpbmVkOyBub2RlID0gaXRlci5uZXh0KCkudmFsdWU7KSB7XG4gICAgICAgIHZhciBwYXNzRnJvbSA9IG1vcmVGcm9tICYmIGl0ZXIub2Zmc2V0IC0gbm9kZS53aWR0aCA9PSBzdGFydCA/IGZyb20gOiBudWxsO1xuICAgICAgICB2YXIgcGFzc1RvID0gbW9yZVRvICYmIGl0ZXIub2Zmc2V0ID09IGVuZCA/IHRvIDogbnVsbDtcbiAgICAgICAgaWYgKHBhc3NGcm9tIHx8IHBhc3NUbykgbm9kZSA9IG5vZGUuc2xpY2VCZXR3ZWVuKHBhc3NGcm9tLCBwYXNzVG8sIGRlcHRoICsgMSk7XG4gICAgICAgIG5vZGVzLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3Iobm9kZXMpO1xuICAgIH1cblxuICAgIC8vIDo6IChTY2hlbWEsIE9iamVjdCkg4oaSIEZyYWdtZW50XG4gICAgLy8gRGVzZXJpYWxpemUgYSBmcmFnbWVudCBmcm9tIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uLlxuICB9LCB7XG4gICAga2V5OiBcInRleHRDb250ZW50XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICB2YXIgdGV4dCA9IFwiXCI7XG4gICAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgcmV0dXJuIHRleHQgKz0gbi50ZXh0Q29udGVudDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwiZnJvbUpTT05cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZnJvbUpTT04oc2NoZW1hLCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID8gdGhpcy5mcm9tQXJyYXkodmFsdWUubWFwKHNjaGVtYS5ub2RlRnJvbUpTT04pKSA6IGVtcHR5RnJhZ21lbnQ7XG4gICAgfVxuXG4gICAgLy8gOjogKFtOb2RlXSkg4oaSIEZyYWdtZW50XG4gICAgLy8gQnVpbGQgYSBmcmFnbWVudCBmcm9tIGFuIGFycmF5IG9mIG5vZGVzLlxuICB9LCB7XG4gICAga2V5OiBcImZyb21BcnJheVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmcm9tQXJyYXkoYXJyYXkpIHtcbiAgICAgIGlmICghYXJyYXkubGVuZ3RoKSByZXR1cm4gZW1wdHlGcmFnbWVudDtcbiAgICAgIHZhciBoYXNUZXh0ID0gZmFsc2U7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChhcnJheVtpXS5pc1RleHQpIGhhc1RleHQgPSB0cnVlO1xuICAgICAgfXJldHVybiBuZXcgKGhhc1RleHQgPyBUZXh0RnJhZ21lbnQgOiBGbGF0RnJhZ21lbnQpKGFycmF5KTtcbiAgICB9XG5cbiAgICAvLyA6OiAoP3VuaW9uPEZyYWdtZW50LCBOb2RlLCBbTm9kZV0+KSDihpIgRnJhZ21lbnRcbiAgICAvLyBDcmVhdGUgYSBmcmFnbWVudCBmcm9tIHNvbWV0aGluZyB0aGF0IGNhbiBiZSBpbnRlcnByZXRlZCBhcyBhIHNldFxuICAgIC8vIG9mIG5vZGVzLiBGb3IgYG51bGxgLCBpdCByZXR1cm5zIHRoZSBlbXB0eSBmcmFnbWVudC4gRm9yIGFcbiAgICAvLyBmcmFnbWVudCwgdGhlIGZyYWdtZW50IGl0c2VsZi4gRm9yIGEgbm9kZSBvciBhcnJheSBvZiBub2RlcywgYVxuICAgIC8vIGZyYWdtZW50IGNvbnRhaW5pbmcgdGhvc2Ugbm9kZXMuXG4gIH0sIHtcbiAgICBrZXk6IFwiZnJvbVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmcm9tKG5vZGVzKSB7XG4gICAgICBpZiAoIW5vZGVzKSByZXR1cm4gZW1wdHlGcmFnbWVudDtcbiAgICAgIGlmIChub2RlcyBpbnN0YW5jZW9mIEZyYWdtZW50KSByZXR1cm4gbm9kZXM7XG4gICAgICByZXR1cm4gdGhpcy5mcm9tQXJyYXkoQXJyYXkuaXNBcnJheShub2RlcykgPyBub2RlcyA6IFtub2Rlc10pO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBGcmFnbWVudDtcbn0pKCk7XG5cbmV4cG9ydHMuRnJhZ21lbnQgPSBGcmFnbWVudDtcblxudmFyIGl0ZXJFbmQgPSB7IGRvbmU6IHRydWUgfTtcblxudmFyIEZsYXRJdGVyYXRvciA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEZsYXRJdGVyYXRvcihhcnJheSwgcG9zLCBlbmQpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRmxhdEl0ZXJhdG9yKTtcblxuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbiAgICB0aGlzLnBvcyA9IHBvcztcbiAgICB0aGlzLmVuZCA9IGVuZDtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhGbGF0SXRlcmF0b3IsIFt7XG4gICAga2V5OiBcImNvcHlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29weSgpIHtcbiAgICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLmFycmF5LCB0aGlzLnBvcywgdGhpcy5lbmQpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhdEVuZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhdEVuZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnBvcyA9PSB0aGlzLmVuZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibmV4dFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgcmV0dXJuIHRoaXMucG9zID09IHRoaXMuZW5kID8gaXRlckVuZCA6IHRoaXMuYXJyYXlbdGhpcy5wb3MrK107XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm9mZnNldFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMucG9zO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBGbGF0SXRlcmF0b3I7XG59KSgpO1xuXG52YXIgUmV2ZXJzZUZsYXRJdGVyYXRvciA9IChmdW5jdGlvbiAoX0ZsYXRJdGVyYXRvcikge1xuICBfaW5oZXJpdHMoUmV2ZXJzZUZsYXRJdGVyYXRvciwgX0ZsYXRJdGVyYXRvcik7XG5cbiAgZnVuY3Rpb24gUmV2ZXJzZUZsYXRJdGVyYXRvcigpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUmV2ZXJzZUZsYXRJdGVyYXRvcik7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihSZXZlcnNlRmxhdEl0ZXJhdG9yLnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIC8vIDs7ICNmb3J3YXJkPUZyYWdtZW50XG5cbiAgX2NyZWF0ZUNsYXNzKFJldmVyc2VGbGF0SXRlcmF0b3IsIFt7XG4gICAga2V5OiBcIm5leHRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnBvcyA9PSB0aGlzLmVuZCA/IGl0ZXJFbmQgOiB0aGlzLmFycmF5Wy0tdGhpcy5wb3NdO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBSZXZlcnNlRmxhdEl0ZXJhdG9yO1xufSkoRmxhdEl0ZXJhdG9yKTtcblxudmFyIEZsYXRGcmFnbWVudCA9IChmdW5jdGlvbiAoX0ZyYWdtZW50KSB7XG4gIF9pbmhlcml0cyhGbGF0RnJhZ21lbnQsIF9GcmFnbWVudCk7XG5cbiAgZnVuY3Rpb24gRmxhdEZyYWdtZW50KGNvbnRlbnQpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRmxhdEZyYWdtZW50KTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKEZsYXRGcmFnbWVudC5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmNhbGwodGhpcyk7XG4gICAgdGhpcy5jb250ZW50ID0gY29udGVudDtcbiAgfVxuXG4gIC8vIDo6IEZyYWdtZW50XG4gIC8vIEFuIGVtcHR5IGZyYWdtZW50LiBJbnRlbmRlZCB0byBiZSByZXVzZWQgd2hlbmV2ZXIgYSBub2RlIGRvZXNuJ3RcbiAgLy8gY29udGFpbiBhbnl0aGluZyAocmF0aGVyIHRoYW4gYWxsb2NhdGluZyBhIG5ldyBlbXB0eSBmcmFnbWVudCBmb3JcbiAgLy8gZWFjaCBsZWFmIG5vZGUpLlxuXG4gIC8vIDo6ICg/bnVtYmVyLCA/bnVtYmVyKSDihpIgSXRlcmF0b3I8Tm9kZT5cbiAgLy8gQ3JlYXRlIGEgZm9yd2FyZCBpdGVyYXRvciBvdmVyIHRoZSBjb250ZW50IG9mIHRoZSBmcmFnbWVudC4gQW5cbiAgLy8gZXhwbGljaXQgc3RhcnQgYW5kIGVuZCBvZmZzZXQgY2FuIGJlIGdpdmVuIHRvIGhhdmUgdGhlIGl0ZXJhdG9yXG4gIC8vIGdvIG92ZXIgb25seSBwYXJ0IG9mIHRoZSBjb250ZW50LiBJZiBhbiBpdGVyYXRpb24gYm91bmQgZmFsbHNcbiAgLy8gd2l0aGluIGEgdGV4dCBub2RlLCBvbmx5IHRoZSBwYXJ0IHRoYXQgaXMgd2l0aGluIHRoZSBib3VuZHMgaXNcbiAgLy8geWllbGRlZC5cblxuICBfY3JlYXRlQ2xhc3MoRmxhdEZyYWdtZW50LCBbe1xuICAgIGtleTogXCJpdGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGl0ZXIoKSB7XG4gICAgICB2YXIgc3RhcnQgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyAwIDogYXJndW1lbnRzWzBdO1xuICAgICAgdmFyIGVuZCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IHRoaXMuc2l6ZSA6IGFyZ3VtZW50c1sxXTtcblxuICAgICAgcmV0dXJuIG5ldyBGbGF0SXRlcmF0b3IodGhpcy5jb250ZW50LCBzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoP251bWJlciwgP251bWJlcikg4oaSIEl0ZXJhdG9yPE5vZGU+XG4gICAgLy8gQ3JlYXRlIGEgcmV2ZXJzZSBpdGVyYXRvciBvdmVyIHRoZSBjb250ZW50IG9mIHRoZSBmcmFnbWVudC4gQW5cbiAgICAvLyBleHBsaWNpdCBzdGFydCBhbmQgZW5kIG9mZnNldCBjYW4gYmUgZ2l2ZW4gdG8gaGF2ZSB0aGUgaXRlcmF0b3JcbiAgICAvLyBnbyBvdmVyIG9ubHkgcGFydCBvZiB0aGUgY29udGVudC4gKipOb3RlKio6IGBzdGFydGAgc2hvdWxkIGJlXG4gICAgLy8gZ3JlYXRlciB0aGFuIGBlbmRgLCB3aGVuIHBhc3NlZC5cbiAgfSwge1xuICAgIGtleTogXCJyZXZlcnNlSXRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXZlcnNlSXRlcigpIHtcbiAgICAgIHZhciBzdGFydCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IHRoaXMuc2l6ZSA6IGFyZ3VtZW50c1swXTtcbiAgICAgIHZhciBlbmQgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyAwIDogYXJndW1lbnRzWzFdO1xuXG4gICAgICByZXR1cm4gbmV3IFJldmVyc2VGbGF0SXRlcmF0b3IodGhpcy5jb250ZW50LCBzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvLyA6OiBudW1iZXJcbiAgICAvLyBUaGUgbWF4aW11bSBvZmZzZXQgaW4gdGhpcyBmcmFnbWVudC5cbiAgfSwge1xuICAgIGtleTogXCJjaGlsZFwiLFxuXG4gICAgLy8gOjogKG51bWJlcikg4oaSIE5vZGVcbiAgICAvLyBHZXQgdGhlIGNoaWxkIGF0IHRoZSBnaXZlbiBvZmZzZXQuIE1pZ2h0IHJldHVybiBhIHRleHQgbm9kZSB0aGF0XG4gICAgLy8gc3RyZXRjaGVzIGJlZm9yZSBhbmQvb3IgYWZ0ZXIgdGhlIG9mZnNldC5cbiAgICB2YWx1ZTogZnVuY3Rpb24gY2hpbGQob2ZmKSB7XG4gICAgICBpZiAob2ZmIDwgMCB8fCBvZmYgPj0gdGhpcy5jb250ZW50Lmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKFwiT2Zmc2V0IFwiICsgb2ZmICsgXCIgb3V0IG9mIHJhbmdlXCIpO1xuICAgICAgcmV0dXJuIHRoaXMuY29udGVudFtvZmZdO1xuICAgIH1cblxuICAgIC8vIDo6ICgobm9kZTogTm9kZSwgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpKVxuICAgIC8vIENhbGwgdGhlIGdpdmVuIGZ1bmN0aW9uIGZvciBlYWNoIG5vZGUgaW4gdGhlIGZyYWdtZW50LCBwYXNzaW5nIGl0XG4gICAgLy8gdGhlIG5vZGUsIGl0cyBzdGFydCBvZmZzZXQsIGFuZCBpdHMgZW5kIG9mZnNldC5cbiAgfSwge1xuICAgIGtleTogXCJmb3JFYWNoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZvckVhY2goZikge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbnRlbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZih0aGlzLmNvbnRlbnRbaV0sIGksIGkgKyAxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA6OiAobnVtYmVyKSDihpIge3N0YXJ0OiBudW1iZXIsIG5vZGU6IE5vZGV9XG4gICAgLy8gRmluZCB0aGUgbm9kZSBiZWZvcmUgdGhlIGdpdmVuIG9mZnNldC4gUmV0dXJucyBhbiBvYmplY3RcbiAgICAvLyBjb250YWluaW5nIHRoZSBub2RlIGFzIHdlbGwgYXMgaXRzIHN0YXJ0IGluZGV4LiBPZmZzZXQgc2hvdWxkIGJlXG4gICAgLy8gZ3JlYXRlciB0aGFuIHplcm8uXG4gIH0sIHtcbiAgICBrZXk6IFwiY2h1bmtCZWZvcmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2h1bmtCZWZvcmUob2ZmKSB7XG4gICAgICByZXR1cm4geyBub2RlOiB0aGlzLmNoaWxkKG9mZiAtIDEpLCBzdGFydDogb2ZmIC0gMSB9O1xuICAgIH1cblxuICAgIC8vIDo6IChudW1iZXIpIOKGkiB7c3RhcnQ6IG51bWJlciwgbm9kZTogTm9kZX1cbiAgICAvLyBGaW5kIHRoZSBub2RlIGFmdGVyIHRoZSBnaXZlbiBvZmZzZXQuIFJldHVybnMgYW4gb2JqZWN0XG4gICAgLy8gY29udGFpbmluZyB0aGUgbm9kZSBhcyB3ZWxsIGFzIGl0cyBzdGFydCBpbmRleC4gT2Zmc2V0IHNob3VsZCBiZVxuICAgIC8vIGxlc3MgdGhhbiB0aGUgZnJhZ21lbnQncyBzaXplLlxuICB9LCB7XG4gICAga2V5OiBcImNodW5rQWZ0ZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2h1bmtBZnRlcihvZmYpIHtcbiAgICAgIHJldHVybiB7IG5vZGU6IHRoaXMuY2hpbGQob2ZmKSwgc3RhcnQ6IG9mZiB9O1xuICAgIH1cblxuICAgIC8vIDo6IChudW1iZXIsID9udW1iZXIpIOKGkiBGcmFnbWVudFxuICAgIC8vIFJldHVybiBhIGZyYWdtZW50IHdpdGggb25seSB0aGUgbm9kZXMgYmV0d2VlbiB0aGUgZ2l2ZW4gb2Zmc2V0cy5cbiAgICAvLyBXaGVuIGB0b2AgaXMgbm90IGdpdmVuLCB0aGUgc2xpY2Ugd2lsbCBnbyB0byB0aGUgZW5kIG9mIHRoZVxuICAgIC8vIGZyYWdtZW50LlxuICB9LCB7XG4gICAga2V5OiBcInNsaWNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNsaWNlKGZyb20pIHtcbiAgICAgIHZhciB0byA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IHRoaXMuc2l6ZSA6IGFyZ3VtZW50c1sxXTtcblxuICAgICAgaWYgKGZyb20gPT0gdG8pIHJldHVybiBlbXB0eUZyYWdtZW50O1xuICAgICAgcmV0dXJuIG5ldyBGbGF0RnJhZ21lbnQodGhpcy5jb250ZW50LnNsaWNlKGZyb20sIHRvKSk7XG4gICAgfVxuXG4gICAgLy8gOjogKG51bWJlciwgTm9kZSkg4oaSIEZyYWdtZW50XG4gICAgLy8gUmV0dXJuIGEgZnJhZ21lbnQgaW4gd2hpY2ggdGhlIG5vZGUgYXQgdGhlIGdpdmVuIG9mZnNldCBpc1xuICAgIC8vIHJlcGxhY2VkIGJ5IHRoZSBnaXZlbiBub2RlLiBUaGUgbm9kZSwgYXMgd2VsbCBhcyB0aGUgb25lIGl0XG4gICAgLy8gcmVwbGFjZXMsIHNob3VsZCBub3QgYmUgdGV4dCBub2Rlcy5cbiAgfSwge1xuICAgIGtleTogXCJyZXBsYWNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlcGxhY2Uob2Zmc2V0LCBub2RlKSB7XG4gICAgICBpZiAobm9kZS5pc1RleHQpIHRocm93IG5ldyBFcnJvcihcIkFyZ3VtZW50IHRvIHJlcGxhY2Ugc2hvdWxkIGJlIGEgbm9uLXRleHQgbm9kZVwiKTtcbiAgICAgIHZhciBjb3B5ID0gdGhpcy5jb250ZW50LnNsaWNlKCk7XG4gICAgICBjb3B5W29mZnNldF0gPSBub2RlO1xuICAgICAgcmV0dXJuIG5ldyBGbGF0RnJhZ21lbnQoY29weSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImFwcGVuZElubmVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFwcGVuZElubmVyKG90aGVyLCBqb2luTGVmdCwgam9pblJpZ2h0KSB7XG4gICAgICB2YXIgbGFzdCA9IHRoaXMuY29udGVudC5sZW5ndGggLSAxLFxuICAgICAgICAgIGNvbnRlbnQgPSB0aGlzLmNvbnRlbnQuc2xpY2UoMCwgbGFzdCk7XG4gICAgICB2YXIgYmVmb3JlID0gdGhpcy5jb250ZW50W2xhc3RdLFxuICAgICAgICAgIGFmdGVyID0gb3RoZXIuZmlyc3RDaGlsZDtcbiAgICAgIGlmIChqb2luTGVmdCA+IDAgJiYgam9pblJpZ2h0ID4gMCAmJiBiZWZvcmUuc2FtZU1hcmt1cChhZnRlcikpIGNvbnRlbnQucHVzaChiZWZvcmUuYXBwZW5kKGFmdGVyLmNvbnRlbnQsIGpvaW5MZWZ0IC0gMSwgam9pblJpZ2h0IC0gMSkpO2Vsc2UgY29udGVudC5wdXNoKGJlZm9yZS5jbG9zZShqb2luTGVmdCAtIDEsIFwiZW5kXCIpLCBhZnRlci5jbG9zZShqb2luUmlnaHQgLSAxLCBcInN0YXJ0XCIpKTtcbiAgICAgIHJldHVybiBGcmFnbWVudC5mcm9tQXJyYXkoY29udGVudC5jb25jYXQob3RoZXIudG9BcnJheShhZnRlci53aWR0aCkpKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoKSDihpIgT2JqZWN0XG4gICAgLy8gQ3JlYXRlIGEgSlNPTi1zZXJpYWxpemVhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgZnJhZ21lbnQuXG4gIH0sIHtcbiAgICBrZXk6IFwidG9KU09OXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQubWFwKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgIHJldHVybiBuLnRvSlNPTigpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNpemVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQubGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIDo6ID9Ob2RlXG4gICAgLy8gVGhlIGZpcnN0IGNoaWxkIG9mIHRoZSBmcmFnbWVudCwgb3IgYG51bGxgIGlmIGl0IGlzIGVtcHR5LlxuICB9LCB7XG4gICAga2V5OiBcImZpcnN0Q2hpbGRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQubGVuZ3RoID8gdGhpcy5jb250ZW50WzBdIDogbnVsbDtcbiAgICB9XG5cbiAgICAvLyA6OiA/Tm9kZVxuICAgIC8vIFRoZSBsYXN0IGNoaWxkIG9mIHRoZSBmcmFnbWVudCwgb3IgYG51bGxgIGlmIGl0IGlzIGVtcHR5LlxuICB9LCB7XG4gICAga2V5OiBcImxhc3RDaGlsZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGVudC5sZW5ndGggPyB0aGlzLmNvbnRlbnRbdGhpcy5jb250ZW50Lmxlbmd0aCAtIDFdIDogbnVsbDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRmxhdEZyYWdtZW50O1xufSkoRnJhZ21lbnQpO1xuXG52YXIgZW1wdHlGcmFnbWVudCA9IG5ldyBGbGF0RnJhZ21lbnQoW10pO1xuXG5leHBvcnRzLmVtcHR5RnJhZ21lbnQgPSBlbXB0eUZyYWdtZW50O1xuXG52YXIgVGV4dEl0ZXJhdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gVGV4dEl0ZXJhdG9yKGZyYWdtZW50LCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0KSB7XG4gICAgdmFyIHBvcyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMyB8fCBhcmd1bWVudHNbM10gPT09IHVuZGVmaW5lZCA/IC0xIDogYXJndW1lbnRzWzNdO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRleHRJdGVyYXRvcik7XG5cbiAgICB0aGlzLmZyYWcgPSBmcmFnbWVudDtcbiAgICB0aGlzLm9mZnNldCA9IHN0YXJ0T2Zmc2V0O1xuICAgIHRoaXMucG9zID0gcG9zO1xuICAgIHRoaXMuZW5kT2Zmc2V0ID0gZW5kT2Zmc2V0O1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFRleHRJdGVyYXRvciwgW3tcbiAgICBrZXk6IFwiY29weVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb3B5KCkge1xuICAgICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuZnJhZywgdGhpcy5vZmZzZXQsIHRoaXMuZW5kT2Zmc2V0LCB0aGlzLnBvcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImF0RW5kXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGF0RW5kKCkge1xuICAgICAgcmV0dXJuIHRoaXMub2Zmc2V0ID09IHRoaXMuZW5kT2Zmc2V0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJuZXh0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICBpZiAodGhpcy5wb3MgPT0gLTEpIHtcbiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5pbml0KCk7XG4gICAgICAgIGlmIChzdGFydCkgcmV0dXJuIHN0YXJ0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMub2Zmc2V0ID09IHRoaXMuZW5kT2Zmc2V0ID8gaXRlckVuZCA6IHRoaXMuYWR2YW5jZSgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhZHZhbmNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkdmFuY2UoKSB7XG4gICAgICB2YXIgbm9kZSA9IHRoaXMuZnJhZy5jb250ZW50W3RoaXMucG9zKytdLFxuICAgICAgICAgIGVuZCA9IHRoaXMub2Zmc2V0ICsgbm9kZS53aWR0aDtcbiAgICAgIGlmIChlbmQgPiB0aGlzLmVuZE9mZnNldCkge1xuICAgICAgICBub2RlID0gbm9kZS5jb3B5KG5vZGUudGV4dC5zbGljZSgwLCB0aGlzLmVuZE9mZnNldCAtIHRoaXMub2Zmc2V0KSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gdGhpcy5lbmRPZmZzZXQ7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgICAgfVxuICAgICAgdGhpcy5vZmZzZXQgPSBlbmQ7XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW5pdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgdGhpcy5wb3MgPSAwO1xuICAgICAgdmFyIG9mZnNldCA9IDA7XG4gICAgICB3aGlsZSAob2Zmc2V0IDwgdGhpcy5vZmZzZXQpIHtcbiAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmZyYWcuY29udGVudFt0aGlzLnBvcysrXSxcbiAgICAgICAgICAgIGVuZCA9IG9mZnNldCArIG5vZGUud2lkdGg7XG4gICAgICAgIGlmIChlbmQgPT0gdGhpcy5vZmZzZXQpIGJyZWFrO1xuICAgICAgICBpZiAoZW5kID4gdGhpcy5vZmZzZXQpIHtcbiAgICAgICAgICB2YXIgc2xpY2VFbmQgPSBub2RlLndpZHRoO1xuICAgICAgICAgIGlmIChlbmQgPiB0aGlzLmVuZE9mZnNldCkge1xuICAgICAgICAgICAgc2xpY2VFbmQgPSB0aGlzLmVuZE9mZnNldCAtIG9mZnNldDtcbiAgICAgICAgICAgIGVuZCA9IHRoaXMuZW5kT2Zmc2V0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBub2RlID0gbm9kZS5jb3B5KG5vZGUudGV4dC5zbGljZSh0aGlzLm9mZnNldCAtIG9mZnNldCwgc2xpY2VFbmQpKTtcbiAgICAgICAgICB0aGlzLm9mZnNldCA9IGVuZDtcbiAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICBvZmZzZXQgPSBlbmQ7XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFRleHRJdGVyYXRvcjtcbn0pKCk7XG5cbnZhciBSZXZlcnNlVGV4dEl0ZXJhdG9yID0gKGZ1bmN0aW9uIChfVGV4dEl0ZXJhdG9yKSB7XG4gIF9pbmhlcml0cyhSZXZlcnNlVGV4dEl0ZXJhdG9yLCBfVGV4dEl0ZXJhdG9yKTtcblxuICBmdW5jdGlvbiBSZXZlcnNlVGV4dEl0ZXJhdG9yKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBSZXZlcnNlVGV4dEl0ZXJhdG9yKTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKFJldmVyc2VUZXh0SXRlcmF0b3IucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFJldmVyc2VUZXh0SXRlcmF0b3IsIFt7XG4gICAga2V5OiBcImFkdmFuY2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWR2YW5jZSgpIHtcbiAgICAgIHZhciBub2RlID0gdGhpcy5mcmFnLmNvbnRlbnRbLS10aGlzLnBvc10sXG4gICAgICAgICAgZW5kID0gdGhpcy5vZmZzZXQgLSBub2RlLndpZHRoO1xuICAgICAgaWYgKGVuZCA8IHRoaXMuZW5kT2Zmc2V0KSB7XG4gICAgICAgIG5vZGUgPSBub2RlLmNvcHkobm9kZS50ZXh0LnNsaWNlKHRoaXMuZW5kT2Zmc2V0IC0gZW5kKSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gdGhpcy5lbmRPZmZzZXQ7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgICAgfVxuICAgICAgdGhpcy5vZmZzZXQgPSBlbmQ7XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW5pdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgdGhpcy5wb3MgPSB0aGlzLmZyYWcuY29udGVudC5sZW5ndGg7XG4gICAgICB2YXIgb2Zmc2V0ID0gdGhpcy5mcmFnLnNpemU7XG4gICAgICB3aGlsZSAob2Zmc2V0ID4gdGhpcy5vZmZzZXQpIHtcbiAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmZyYWcuY29udGVudFstLXRoaXMucG9zXSxcbiAgICAgICAgICAgIGVuZCA9IG9mZnNldCAtIG5vZGUud2lkdGg7XG4gICAgICAgIGlmIChlbmQgPT0gdGhpcy5vZmZzZXQpIGJyZWFrO1xuICAgICAgICBpZiAoZW5kIDwgdGhpcy5vZmZzZXQpIHtcbiAgICAgICAgICBpZiAoZW5kIDwgdGhpcy5lbmRPZmZzZXQpIHtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLmNvcHkobm9kZS50ZXh0LnNsaWNlKHRoaXMuZW5kT2Zmc2V0IC0gZW5kLCB0aGlzLm9mZnNldCAtIGVuZCkpO1xuICAgICAgICAgICAgZW5kID0gdGhpcy5lbmRPZmZzZXQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLmNvcHkobm9kZS50ZXh0LnNsaWNlKDAsIHRoaXMub2Zmc2V0IC0gZW5kKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMub2Zmc2V0ID0gZW5kO1xuICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIG9mZnNldCA9IGVuZDtcbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUmV2ZXJzZVRleHRJdGVyYXRvcjtcbn0pKFRleHRJdGVyYXRvcik7XG5cbnZhciBUZXh0RnJhZ21lbnQgPSAoZnVuY3Rpb24gKF9GcmFnbWVudDIpIHtcbiAgX2luaGVyaXRzKFRleHRGcmFnbWVudCwgX0ZyYWdtZW50Mik7XG5cbiAgZnVuY3Rpb24gVGV4dEZyYWdtZW50KGNvbnRlbnQsIHNpemUpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVGV4dEZyYWdtZW50KTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKFRleHRGcmFnbWVudC5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmNhbGwodGhpcyk7XG4gICAgdGhpcy5jb250ZW50ID0gY29udGVudDtcbiAgICB0aGlzLnNpemUgPSBzaXplIHx8IDA7XG4gICAgaWYgKHNpemUgPT0gbnVsbCkgZm9yICh2YXIgaSA9IDA7IGkgPCBjb250ZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnNpemUgKz0gY29udGVudFtpXS53aWR0aDtcbiAgICB9XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoVGV4dEZyYWdtZW50LCBbe1xuICAgIGtleTogXCJpdGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGl0ZXIoKSB7XG4gICAgICB2YXIgZnJvbSA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IDAgOiBhcmd1bWVudHNbMF07XG4gICAgICB2YXIgdG8gPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyB0aGlzLnNpemUgOiBhcmd1bWVudHNbMV07XG5cbiAgICAgIHJldHVybiBuZXcgVGV4dEl0ZXJhdG9yKHRoaXMsIGZyb20sIHRvKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmV2ZXJzZUl0ZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmV2ZXJzZUl0ZXIoKSB7XG4gICAgICB2YXIgZnJvbSA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IHRoaXMuc2l6ZSA6IGFyZ3VtZW50c1swXTtcbiAgICAgIHZhciB0byA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IDAgOiBhcmd1bWVudHNbMV07XG5cbiAgICAgIHJldHVybiBuZXcgUmV2ZXJzZVRleHRJdGVyYXRvcih0aGlzLCBmcm9tLCB0byk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNoaWxkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNoaWxkKG9mZikge1xuICAgICAgaWYgKG9mZiA8IDAgfHwgb2ZmID49IHRoaXMuc2l6ZSkgdGhyb3cgbmV3IEVycm9yKFwiT2Zmc2V0IFwiICsgb2ZmICsgXCIgb3V0IG9mIHJhbmdlXCIpO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGN1ck9mZiA9IDA7IGkgPCB0aGlzLmNvbnRlbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNoaWxkID0gdGhpcy5jb250ZW50W2ldO1xuICAgICAgICBjdXJPZmYgKz0gY2hpbGQud2lkdGg7XG4gICAgICAgIGlmIChjdXJPZmYgPiBvZmYpIHJldHVybiBjaGlsZDtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZm9yRWFjaFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmb3JFYWNoKGYpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBvZmYgPSAwOyBpIDwgdGhpcy5jb250ZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjaGlsZCA9IHRoaXMuY29udGVudFtpXTtcbiAgICAgICAgZihjaGlsZCwgb2ZmLCBvZmYgKz0gY2hpbGQud2lkdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjaHVua0JlZm9yZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjaHVua0JlZm9yZShvZmYpIHtcbiAgICAgIGlmICghb2ZmKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBjaHVuayBiZWZvcmUgc3RhcnQgb2Ygbm9kZVwiKTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBjdXJPZmYgPSAwOyBpIDwgdGhpcy5jb250ZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjaGlsZCA9IHRoaXMuY29udGVudFtpXSxcbiAgICAgICAgICAgIGVuZCA9IGN1ck9mZiArIGNoaWxkLndpZHRoO1xuICAgICAgICBpZiAoZW5kID49IG9mZikgcmV0dXJuIHsgbm9kZTogY2hpbGQsIHN0YXJ0OiBjdXJPZmYgfTtcbiAgICAgICAgY3VyT2ZmID0gZW5kO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjaHVua0FmdGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNodW5rQWZ0ZXIob2ZmKSB7XG4gICAgICBpZiAob2ZmID09IHRoaXMuc2l6ZSkgdGhyb3cgbmV3IEVycm9yKFwiTm8gY2h1bmsgYWZ0ZXIgZW5kIG9mIG5vZGVcIik7XG4gICAgICBmb3IgKHZhciBpID0gMCwgY3VyT2ZmID0gMDsgaSA8IHRoaXMuY29udGVudC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmNvbnRlbnRbaV0sXG4gICAgICAgICAgICBlbmQgPSBjdXJPZmYgKyBjaGlsZC53aWR0aDtcbiAgICAgICAgaWYgKGVuZCA+IG9mZikgcmV0dXJuIHsgbm9kZTogY2hpbGQsIHN0YXJ0OiBjdXJPZmYgfTtcbiAgICAgICAgY3VyT2ZmID0gZW5kO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzbGljZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzbGljZSgpIHtcbiAgICAgIHZhciBmcm9tID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8gMCA6IGFyZ3VtZW50c1swXTtcbiAgICAgIHZhciB0byA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IHRoaXMuc2l6ZSA6IGFyZ3VtZW50c1sxXTtcblxuICAgICAgaWYgKGZyb20gPT0gdG8pIHJldHVybiBlbXB0eUZyYWdtZW50O1xuICAgICAgcmV0dXJuIG5ldyBUZXh0RnJhZ21lbnQodGhpcy50b0FycmF5KGZyb20sIHRvKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlcGxhY2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVwbGFjZShvZmYsIG5vZGUpIHtcbiAgICAgIGlmIChub2RlLmlzVGV4dCkgdGhyb3cgbmV3IEVycm9yKFwiQXJndW1lbnQgdG8gcmVwbGFjZSBzaG91bGQgYmUgYSBub24tdGV4dCBub2RlXCIpO1xuICAgICAgdmFyIGN1ck5vZGUgPSB1bmRlZmluZWQsXG4gICAgICAgICAgaW5kZXggPSB1bmRlZmluZWQ7XG4gICAgICBmb3IgKHZhciBjdXJPZmYgPSAwOyBjdXJPZmYgPCBvZmY7IGluZGV4KyspIHtcbiAgICAgICAgY3VyTm9kZSA9IHRoaXMuY29udGVudFtpbmRleF07XG4gICAgICAgIGN1ck9mZiArPSBjdXJOb2RlLndpZHRoO1xuICAgICAgfVxuICAgICAgaWYgKGN1ck5vZGUuaXNUZXh0KSB0aHJvdyBuZXcgRXJyb3IoXCJDYW4gbm90IHJlcGxhY2UgdGV4dCBjb250ZW50IHdpdGggcmVwbGFjZSBtZXRob2RcIik7XG4gICAgICB2YXIgY29weSA9IHRoaXMuY29udGVudC5zbGljZSgpO1xuICAgICAgY29weVtpbmRleF0gPSBub2RlO1xuICAgICAgcmV0dXJuIG5ldyBUZXh0RnJhZ21lbnQoY29weSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImFwcGVuZElubmVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFwcGVuZElubmVyKG90aGVyLCBqb2luTGVmdCwgam9pblJpZ2h0KSB7XG4gICAgICB2YXIgbGFzdCA9IHRoaXMuY29udGVudC5sZW5ndGggLSAxLFxuICAgICAgICAgIGNvbnRlbnQgPSB0aGlzLmNvbnRlbnQuc2xpY2UoMCwgbGFzdCk7XG4gICAgICB2YXIgYmVmb3JlID0gdGhpcy5jb250ZW50W2xhc3RdLFxuICAgICAgICAgIGFmdGVyID0gb3RoZXIuZmlyc3RDaGlsZDtcbiAgICAgIHZhciBzYW1lID0gYmVmb3JlLnNhbWVNYXJrdXAoYWZ0ZXIpO1xuICAgICAgaWYgKHNhbWUgJiYgYmVmb3JlLmlzVGV4dCkgY29udGVudC5wdXNoKGJlZm9yZS5jb3B5KGJlZm9yZS50ZXh0ICsgYWZ0ZXIudGV4dCkpO2Vsc2UgaWYgKHNhbWUgJiYgam9pbkxlZnQgPiAwICYmIGpvaW5SaWdodCA+IDApIGNvbnRlbnQucHVzaChiZWZvcmUuYXBwZW5kKGFmdGVyLmNvbnRlbnQsIGpvaW5MZWZ0IC0gMSwgam9pblJpZ2h0IC0gMSkpO2Vsc2UgY29udGVudC5wdXNoKGJlZm9yZS5jbG9zZShqb2luTGVmdCAtIDEsIFwiZW5kXCIpLCBhZnRlci5jbG9zZShqb2luUmlnaHQgLSAxLCBcInN0YXJ0XCIpKTtcbiAgICAgIHJldHVybiBGcmFnbWVudC5mcm9tQXJyYXkoY29udGVudC5jb25jYXQob3RoZXIudG9BcnJheShhZnRlci53aWR0aCkpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidG9KU09OXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQubWFwKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgIHJldHVybiBuLnRvSlNPTigpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImZpcnN0Q2hpbGRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNpemUgPyB0aGlzLmNvbnRlbnRbMF0gOiBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJsYXN0Q2hpbGRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNpemUgPyB0aGlzLmNvbnRlbnRbdGhpcy5jb250ZW50Lmxlbmd0aCAtIDFdIDogbnVsbDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gVGV4dEZyYWdtZW50O1xufSkoRnJhZ21lbnQpO1xuXG5pZiAodHlwZW9mIFN5bWJvbCAhPSBcInVuZGVmaW5lZFwiKSB7XG4gIC8vIDo6ICgpIOKGkiBJdGVyYXRvcjxOb2RlPlxuICAvLyBBIGZyYWdtZW50IGlzIGl0ZXJhYmxlLCBpbiB0aGUgRVM2IHNlbnNlLlxuICBGcmFnbWVudC5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5pdGVyKCk7XG4gIH07XG4gIEZsYXRJdGVyYXRvci5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IFRleHRJdGVyYXRvci5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbn0iLCIvLyAhIVxuLy8gVGhpcyBtb2R1bGUgZGVmaW5lcyBQcm9zZU1pcnJvcidzIGRvY3VtZW50IG1vZGVsLCB0aGUgZGF0YVxuLy8gc3RydWN0dXJlIHVzZWQgdG8gZGVmaW5lIGFuZCBpbnNwZWN0IGNvbnRlbnQgZG9jdW1lbnRzLiBJdFxuLy8gaW5jbHVkZXM6XG4vL1xuLy8gKiBUaGUgW25vZGVdKCNOb2RlKSB0eXBlIHRoYXQgcmVwcmVzZW50cyBkb2N1bWVudCBlbGVtZW50c1xuLy9cbi8vICogVGhlIFtzY2hlbWFdKCNTY2hlbWEpIHR5cGVzIHVzZWQgdG8gdGFnIGFuZCBjb25zdHJhaW4gdGhlXG4vLyAgIGRvY3VtZW50IHN0cnVjdHVyZVxuLy9cbi8vICogVGhlIGRhdGEgdHlwZSBmb3IgZG9jdW1lbnQgW3Bvc2l0aW9uc10oI1Bvcylcbi8vXG4vLyBUaGlzIG1vZHVsZSBkb2VzIG5vdCBkZXBlbmQgb24gdGhlIGJyb3dzZXIgQVBJIGJlaW5nIGF2YWlsYWJsZVxuLy8gKGkuZS4geW91IGNhbiBsb2FkIGl0IGludG8gYW55IEphdmFTY3JpcHQgZW52aXJvbm1lbnQpLlxuXG5cInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9ub2RlID0gcmVxdWlyZShcIi4vbm9kZVwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm9kZVwiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfbm9kZS5Ob2RlO1xuICAgICAgICB9XG59KTtcblxudmFyIF9mcmFnbWVudCA9IHJlcXVpcmUoXCIuL2ZyYWdtZW50XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJGcmFnbWVudFwiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZnJhZ21lbnQuRnJhZ21lbnQ7XG4gICAgICAgIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZW1wdHlGcmFnbWVudFwiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZnJhZ21lbnQuZW1wdHlGcmFnbWVudDtcbiAgICAgICAgfVxufSk7XG5cbnZhciBfbWFyayA9IHJlcXVpcmUoXCIuL21hcmtcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk1hcmtcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX21hcmsuTWFyaztcbiAgICAgICAgfVxufSk7XG5cbnZhciBfc2NoZW1hID0gcmVxdWlyZShcIi4vc2NoZW1hXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJTY2hlbWFTcGVjXCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9zY2hlbWEuU2NoZW1hU3BlYztcbiAgICAgICAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJTY2hlbWFcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3NjaGVtYS5TY2hlbWE7XG4gICAgICAgIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiU2NoZW1hRXJyb3JcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3NjaGVtYS5TY2hlbWFFcnJvcjtcbiAgICAgICAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb2RlVHlwZVwiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfc2NoZW1hLk5vZGVUeXBlO1xuICAgICAgICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkJsb2NrXCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9zY2hlbWEuQmxvY2s7XG4gICAgICAgIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiVGV4dGJsb2NrXCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9zY2hlbWEuVGV4dGJsb2NrO1xuICAgICAgICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIklubGluZVwiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfc2NoZW1hLklubGluZTtcbiAgICAgICAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUZXh0XCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9zY2hlbWEuVGV4dDtcbiAgICAgICAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNYXJrVHlwZVwiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfc2NoZW1hLk1hcmtUeXBlO1xuICAgICAgICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkF0dHJpYnV0ZVwiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfc2NoZW1hLkF0dHJpYnV0ZTtcbiAgICAgICAgfVxufSk7XG5cbnZhciBfZGVmYXVsdHNjaGVtYSA9IHJlcXVpcmUoXCIuL2RlZmF1bHRzY2hlbWFcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImRlZmF1bHRTY2hlbWFcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2RlZmF1bHRzY2hlbWEuZGVmYXVsdFNjaGVtYTtcbiAgICAgICAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJEb2NcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2RlZmF1bHRzY2hlbWEuRG9jO1xuICAgICAgICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkJsb2NrUXVvdGVcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2RlZmF1bHRzY2hlbWEuQmxvY2tRdW90ZTtcbiAgICAgICAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJPcmRlcmVkTGlzdFwiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZGVmYXVsdHNjaGVtYS5PcmRlcmVkTGlzdDtcbiAgICAgICAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJCdWxsZXRMaXN0XCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9kZWZhdWx0c2NoZW1hLkJ1bGxldExpc3Q7XG4gICAgICAgIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTGlzdEl0ZW1cIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2RlZmF1bHRzY2hlbWEuTGlzdEl0ZW07XG4gICAgICAgIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiSG9yaXpvbnRhbFJ1bGVcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2RlZmF1bHRzY2hlbWEuSG9yaXpvbnRhbFJ1bGU7XG4gICAgICAgIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUGFyYWdyYXBoXCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9kZWZhdWx0c2NoZW1hLlBhcmFncmFwaDtcbiAgICAgICAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJIZWFkaW5nXCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9kZWZhdWx0c2NoZW1hLkhlYWRpbmc7XG4gICAgICAgIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29kZUJsb2NrXCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9kZWZhdWx0c2NoZW1hLkNvZGVCbG9jaztcbiAgICAgICAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJJbWFnZVwiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZGVmYXVsdHNjaGVtYS5JbWFnZTtcbiAgICAgICAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJIYXJkQnJlYWtcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2RlZmF1bHRzY2hlbWEuSGFyZEJyZWFrO1xuICAgICAgICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNvZGVNYXJrXCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9kZWZhdWx0c2NoZW1hLkNvZGVNYXJrO1xuICAgICAgICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkVtTWFya1wiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZGVmYXVsdHNjaGVtYS5FbU1hcms7XG4gICAgICAgIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiU3Ryb25nTWFya1wiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZGVmYXVsdHNjaGVtYS5TdHJvbmdNYXJrO1xuICAgICAgICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkxpbmtNYXJrXCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9kZWZhdWx0c2NoZW1hLkxpbmtNYXJrO1xuICAgICAgICB9XG59KTtcblxudmFyIF9wb3MgPSByZXF1aXJlKFwiLi9wb3NcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlBvc1wiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfcG9zLlBvcztcbiAgICAgICAgfVxufSk7XG5cbnZhciBfZGlmZiA9IHJlcXVpcmUoXCIuL2RpZmZcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImZpbmREaWZmU3RhcnRcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2RpZmYuZmluZERpZmZTdGFydDtcbiAgICAgICAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJmaW5kRGlmZkVuZFwiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZGlmZi5maW5kRGlmZkVuZDtcbiAgICAgICAgfVxufSk7IiwiLy8gOzsgQSBtYXJrIGlzIGEgcGllY2Ugb2YgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYSBub2RlLFxuLy8gc3VjaCBhcyBpdCBiZWluZyBlbXBoYXNpemVkLCBpbiBjb2RlIGZvbnQsIG9yIGEgbGluay4gSXQgaGFzIGEgdHlwZVxuLy8gYW5kIG9wdGlvbmFsbHkgYSBzZXQgb2YgYXR0cmlidXRlcyB0aGF0IHByb3ZpZGUgZnVydGhlciBpbmZvcm1hdGlvblxuLy8gKHN1Y2ggYXMgdGhlIHRhcmdldCBvZiB0aGUgbGluaykuIE1hcmtzIGFyZSBjcmVhdGVkIHRocm91Z2ggYVxuLy8gYFNjaGVtYWAsIHdoaWNoIGNvbnRyb2xzIHdoaWNoIHR5cGVzIGV4aXN0IGFuZCB3aGljaFxuLy8gYXR0cmlidXRlcyB0aGV5IGhhdmUuXG5cInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgTWFyayA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE1hcmsodHlwZSwgYXR0cnMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTWFyayk7XG5cbiAgICAvLyA6OiBNYXJrVHlwZVxuICAgIC8vIFRoZSB0eXBlIG9mIHRoaXMgbWFyay5cbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIC8vIDo6IE9iamVjdFxuICAgIC8vIFRoZSBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1hcmsuXG4gICAgdGhpcy5hdHRycyA9IGF0dHJzO1xuICB9XG5cbiAgLy8gOjogKCkg4oaSIE9iamVjdFxuICAvLyBDb252ZXJ0IHRoaXMgbWFyayB0byBhIEpTT04tc2VyaWFsaXplYWJsZSByZXByZXNlbnRhdGlvbi5cblxuICBfY3JlYXRlQ2xhc3MoTWFyaywgW3tcbiAgICBrZXk6IFwidG9KU09OXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICAgIGlmICh0aGlzLnR5cGUuaW5zdGFuY2UpIHJldHVybiB0aGlzLnR5cGUubmFtZTtcbiAgICAgIHZhciBvYmogPSB7IF86IHRoaXMudHlwZS5uYW1lIH07XG4gICAgICBmb3IgKHZhciBhdHRyIGluIHRoaXMuYXR0cnMpIHtcbiAgICAgICAgb2JqW2F0dHJdID0gdGhpcy5hdHRyc1thdHRyXTtcbiAgICAgIH1yZXR1cm4gb2JqO1xuICAgIH1cblxuICAgIC8vIDo6IChbTWFya10pIOKGkiBbTWFya11cbiAgICAvLyBHaXZlbiBhIHNldCBvZiBtYXJrcywgY3JlYXRlIGEgbmV3IHNldCB3aGljaCBjb250YWlucyB0aGlzIG9uZSBhc1xuICAgIC8vIHdlbGwsIGluIHRoZSByaWdodCBwb3NpdGlvbi4gSWYgdGhpcyBtYXJrIG9yIGFub3RoZXIgb2YgaXRzIHR5cGVcbiAgICAvLyBpcyBhbHJlYWR5IGluIHRoZSBzZXQsIHRoZSBzZXQgaXRzZWxmIGlzIHJldHVybmVkLlxuICB9LCB7XG4gICAga2V5OiBcImFkZFRvU2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZFRvU2V0KHNldCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIG90aGVyID0gc2V0W2ldO1xuICAgICAgICBpZiAob3RoZXIudHlwZSA9PSB0aGlzLnR5cGUpIHtcbiAgICAgICAgICBpZiAodGhpcy5lcShvdGhlcikpIHJldHVybiBzZXQ7ZWxzZSByZXR1cm4gc2V0LnNsaWNlKDAsIGkpLmNvbmNhdCh0aGlzKS5jb25jYXQoc2V0LnNsaWNlKGkgKyAxKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG90aGVyLnR5cGUucmFuayA+IHRoaXMudHlwZS5yYW5rKSByZXR1cm4gc2V0LnNsaWNlKDAsIGkpLmNvbmNhdCh0aGlzKS5jb25jYXQoc2V0LnNsaWNlKGkpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZXQuY29uY2F0KHRoaXMpO1xuICAgIH1cblxuICAgIC8vIDo6IChbTWFya10pIOKGkiBbTWFya11cbiAgICAvLyBSZW1vdmUgdGhpcyBtYXJrIGZyb20gdGhlIGdpdmVuIHNldCwgcmV0dXJuaW5nIGEgbmV3IHNldC4gSWYgdGhpc1xuICAgIC8vIG1hcmsgaXMgbm90IGluIHRoZSBzZXQsIHRoZSBzZXQgaXRzZWxmIGlzIHJldHVybmVkLlxuICB9LCB7XG4gICAga2V5OiBcInJlbW92ZUZyb21TZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlRnJvbVNldChzZXQpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2V0Lmxlbmd0aDsgaSsrKSBpZiAodGhpcy5lcShzZXRbaV0pKSByZXR1cm4gc2V0LnNsaWNlKDAsIGkpLmNvbmNhdChzZXQuc2xpY2UoaSArIDEpKTtcbiAgICAgIHJldHVybiBzZXQ7XG4gICAgfVxuXG4gICAgLy8gOjogKFtNYXJrXSkg4oaSIGJvb2xcbiAgICAvLyBUZXN0IHdoZXRoZXIgdGhpcyBtYXJrIGlzIGluIHRoZSBnaXZlbiBzZXQgb2YgbWFya3MuXG4gIH0sIHtcbiAgICBrZXk6IFwiaXNJblNldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc0luU2V0KHNldCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHRoaXMuZXEoc2V0W2ldKSkgcmV0dXJuIHRydWU7XG4gICAgICB9cmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIDo6IChNYXJrKSDihpIgYm9vbFxuICAgIC8vIFRlc3Qgd2hldGhlciB0aGlzIG1hcmsgaGFzIHRoZSBzYW1lIHR5cGUgYW5kIGF0dHJpYnV0ZXMgYXNcbiAgICAvLyBhbm90aGVyIG1hcmsuXG4gIH0sIHtcbiAgICBrZXk6IFwiZXFcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZXEob3RoZXIpIHtcbiAgICAgIGlmICh0aGlzID09IG90aGVyKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmICh0aGlzLnR5cGUgIT0gb3RoZXIudHlwZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgZm9yICh2YXIgYXR0ciBpbiB0aGlzLmF0dHJzKSB7XG4gICAgICAgIGlmIChvdGhlci5hdHRyc1thdHRyXSAhPSB0aGlzLmF0dHJzW2F0dHJdKSByZXR1cm4gZmFsc2U7XG4gICAgICB9cmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gOjogKFtNYXJrXSwgW01hcmtdKSDihpIgYm9vbFxuICAgIC8vIFRlc3Qgd2hldGhlciB0d28gc2V0cyBvZiBtYXJrcyBhcmUgaWRlbnRpY2FsLlxuICB9XSwgW3tcbiAgICBrZXk6IFwic2FtZVNldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzYW1lU2V0KGEsIGIpIHtcbiAgICAgIGlmIChhID09IGIpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKGEubGVuZ3RoICE9IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCFhW2ldLmVxKGJbaV0pKSByZXR1cm4gZmFsc2U7XG4gICAgICB9cmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gOjogKD91bmlvbjxNYXJrLCBbTWFya10+KSDihpIgW01hcmtdXG4gICAgLy8gQ3JlYXRlIGEgcHJvcGVybHkgc29ydGVkIG1hcmsgc2V0IGZyb20gbnVsbCwgYSBzaW5nbGUgbWFyaywgb3IgYW5cbiAgICAvLyB1bnNvcnRlZCBhcnJheSBvZiBtYXJrcy5cbiAgfSwge1xuICAgIGtleTogXCJzZXRGcm9tXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEZyb20obWFya3MpIHtcbiAgICAgIGlmICghbWFya3MgfHwgbWFya3MubGVuZ3RoID09IDApIHJldHVybiBlbXB0eTtcbiAgICAgIGlmIChtYXJrcyBpbnN0YW5jZW9mIE1hcmspIHJldHVybiBbbWFya3NdO1xuICAgICAgdmFyIGNvcHkgPSBtYXJrcy5zbGljZSgpO1xuICAgICAgY29weS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIHJldHVybiBhLnR5cGUucmFuayAtIGIudHlwZS5yYW5rO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gY29weTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gTWFyaztcbn0pKCk7XG5cbmV4cG9ydHMuTWFyayA9IE1hcms7XG5cbnZhciBlbXB0eSA9IFtdOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2dldCA9IGZ1bmN0aW9uIGdldChfeDgsIF94OSwgX3gxMCkgeyB2YXIgX2FnYWluID0gdHJ1ZTsgX2Z1bmN0aW9uOiB3aGlsZSAoX2FnYWluKSB7IHZhciBvYmplY3QgPSBfeDgsIHByb3BlcnR5ID0gX3g5LCByZWNlaXZlciA9IF94MTA7IF9hZ2FpbiA9IGZhbHNlOyBpZiAob2JqZWN0ID09PSBudWxsKSBvYmplY3QgPSBGdW5jdGlvbi5wcm90b3R5cGU7IHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTsgaWYgKGRlc2MgPT09IHVuZGVmaW5lZCkgeyB2YXIgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7IGlmIChwYXJlbnQgPT09IG51bGwpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSBlbHNlIHsgX3g4ID0gcGFyZW50OyBfeDkgPSBwcm9wZXJ0eTsgX3gxMCA9IHJlY2VpdmVyOyBfYWdhaW4gPSB0cnVlOyBkZXNjID0gcGFyZW50ID0gdW5kZWZpbmVkOyBjb250aW51ZSBfZnVuY3Rpb247IH0gfSBlbHNlIGlmIChcInZhbHVlXCIgaW4gZGVzYykgeyByZXR1cm4gZGVzYy52YWx1ZTsgfSBlbHNlIHsgdmFyIGdldHRlciA9IGRlc2MuZ2V0OyBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSByZXR1cm4gZ2V0dGVyLmNhbGwocmVjZWl2ZXIpOyB9IH0gfTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIF9mcmFnbWVudCA9IHJlcXVpcmUoXCIuL2ZyYWdtZW50XCIpO1xuXG52YXIgX21hcmsgPSByZXF1aXJlKFwiLi9tYXJrXCIpO1xuXG52YXIgX3BvcyA9IHJlcXVpcmUoXCIuL3Bvc1wiKTtcblxudmFyIGVtcHR5QXJyYXkgPSBbXSxcbiAgICBlbXB0eUF0dHJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuLy8gOzsgVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgbm9kZSBpbiB0aGUgdHJlZSB0aGF0IG1ha2VzIHVwIGFcbi8vIFByb3NlTWlycm9yIGRvY3VtZW50LiBTbyBhIGRvY3VtZW50IGlzIGFuIGluc3RhbmNlIG9mIGBOb2RlYCwgd2l0aFxuLy8gY2hpbGRyZW4gdGhhdCBhcmUgYWxzbyBpbnN0YW5jZXMgb2YgYE5vZGVgLlxuLy9cbi8vIE5vZGVzIGFyZSBwZXJzaXN0ZW50IGRhdGEgc3RydWN0dXJlcy4gSW5zdGVhZCBvZiBjaGFuZ2luZyB0aGVtLCB5b3Vcbi8vIGNyZWF0ZSBuZXcgb25lcyB3aXRoIHRoZSBjb250ZW50IHlvdSB3YW50LiBPbGQgb25lcyBrZWVwIHBvaW50aW5nXG4vLyBhdCB0aGUgb2xkIGRvY3VtZW50IHNoYXBlLiBUaGlzIGlzIG1hZGUgY2hlYXBlciBieSBzaGFyaW5nXG4vLyBzdHJ1Y3R1cmUgYmV0d2VlbiB0aGUgb2xkIGFuZCBuZXcgZGF0YSBhcyBtdWNoIGFzIHBvc3NpYmxlLCB3aGljaCBhXG4vLyB0cmVlIHNoYXBlIGxpa2UgdGhpcyAod2l0aG91dCBiYWNrIHBvaW50ZXJzKSBtYWtlcyBlYXN5LlxuLy9cbi8vICoqTmV2ZXIqKiBkaXJlY3RseSBtdXRhdGUgdGhlIHByb3BlcnRpZXMgb2YgYSBgTm9kZWAgb2JqZWN0LlxuXG52YXIgTm9kZSA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE5vZGUodHlwZSwgYXR0cnMsIGNvbnRlbnQsIG1hcmtzKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE5vZGUpO1xuXG4gICAgLy8gOjogTm9kZVR5cGVcbiAgICAvLyBUaGUgdHlwZSBvZiBub2RlIHRoYXQgdGhpcyBpcy5cbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuXG4gICAgLy8gOjogT2JqZWN0XG4gICAgLy8gQW4gb2JqZWN0IG1hcHBpbmcgYXR0cmlidXRlIG5hbWVzIHRvIHN0cmluZyB2YWx1ZXMuIFRoZSBraW5kIG9mXG4gICAgLy8gYXR0cmlidXRlcyBhbGxvd2VkIGFuZCByZXF1aXJlZCBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgbm9kZVxuICAgIC8vIHR5cGUuXG4gICAgdGhpcy5hdHRycyA9IGF0dHJzO1xuXG4gICAgLy8gOjogRnJhZ21lbnRcbiAgICAvLyBUaGUgbm9kZSdzIGNvbnRlbnQuXG4gICAgdGhpcy5jb250ZW50ID0gY29udGVudCB8fCBfZnJhZ21lbnQuZW1wdHlGcmFnbWVudDtcblxuICAgIC8vIDo6IFtNYXJrXVxuICAgIC8vIFRoZSBtYXJrcyAodGhpbmdzIGxpa2Ugd2hldGhlciBpdCBpcyBlbXBoYXNpemVkIG9yIHBhcnQgb2YgYVxuICAgIC8vIGxpbmspIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuXG4gICAgdGhpcy5tYXJrcyA9IG1hcmtzIHx8IGVtcHR5QXJyYXk7XG4gIH1cblxuICAvLyA6OiBudW1iZXJcbiAgLy8gVGhlIHNpemUgb2YgdGhlIG5vZGUncyBjb250ZW50LCB3aGljaCBpcyB0aGUgbWF4aW11bSBvZmZzZXQgaW5cbiAgLy8gdGhlIG5vZGUuIEZvciBub2RlcyB0aGF0IGRvbid0IGNvbnRhaW4gdGV4dCwgdGhpcyBpcyBhbHNvIHRoZVxuICAvLyBudW1iZXIgb2YgY2hpbGQgbm9kZXMgdGhhdCB0aGUgbm9kZSBoYXMuXG5cbiAgX2NyZWF0ZUNsYXNzKE5vZGUsIFt7XG4gICAga2V5OiBcImNoaWxkXCIsXG5cbiAgICAvLyA6OiAobnVtYmVyKSDihpIgTm9kZVxuICAgIC8vIFJldHJpZXZlIHRoZSBjaGlsZCBhdCB0aGUgZ2l2ZW4gb2Zmc2V0LiBOb3RlIHRoYXQgdGhpcyBpcyAqKm5vdCoqXG4gICAgLy8gdGhlIGFwcHJvcHJpYXRlIHdheSB0byBsb29wIG92ZXIgYSBub2RlLiBgY2hpbGRgJ3MgY29tcGxleGl0eSBtYXlcbiAgICAvLyBiZSBub24tY29uc3RhbnQgZm9yIHNvbWUgbm9kZXMsIGFuZCBpdCB3aWxsIHJldHVybiB0aGUgc2FtZSBub2RlXG4gICAgLy8gbXVsdGlwbGUgdGltZXMgd2hlbiBjYWxsaW5nIGl0IGZvciBkaWZmZXJlbnQgb2Zmc2V0cyB3aXRoaW4gYVxuICAgIC8vIHRleHQgbm9kZS5cbiAgICB2YWx1ZTogZnVuY3Rpb24gY2hpbGQob2ZmKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb250ZW50LmNoaWxkKG9mZik7XG4gICAgfVxuXG4gICAgLy8gOjogKD9udW1iZXIsID9udW1iZXIpIOKGkiBJdGVyYXRvcjxOb2RlPlxuICAgIC8vIENyZWF0ZSBhbiBpdGVyYXRvciBvdmVyIHRoaXMgbm9kZSdzIGNoaWxkcmVuLCBvcHRpb25hbGx5IHN0YXJ0aW5nXG4gICAgLy8gYW5kIGVuZGluZyBhdCBhIGdpdmVuIG9mZnNldC5cbiAgfSwge1xuICAgIGtleTogXCJpdGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGl0ZXIoc3RhcnQsIGVuZCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGVudC5pdGVyKHN0YXJ0LCBlbmQpO1xuICAgIH1cblxuICAgIC8vIDo6ICg/bnVtYmVyLCA/bnVtYmVyKSDihpIgSXRlcmF0b3I8Tm9kZT5cbiAgICAvLyBDcmVhdGUgYSByZXZlcnNlIGl0ZXJhdG9yIChpdGVyYXRpbmcgZnJvbSB0aGUgbm9kZSdzIGVuZCB0b3dhcmRzXG4gICAgLy8gaXRzIHN0YXJ0KSBvdmVyIHRoaXMgbm9kZSdzIGNoaWxkcmVuLCBvcHRpb25hbGx5IHN0YXJ0aW5nIGFuZFxuICAgIC8vIGVuZGluZyBhdCBhIGdpdmVuIG9mZnNldC4gKipOb3RlKio6IGlmIGdpdmVuLCBgc3RhcnRgIHNob3VsZCBiZVxuICAgIC8vIGdyZWF0ZXIgdGhhbiAob3IgZXF1YWwpIHRvIGBlbmRgLlxuICB9LCB7XG4gICAga2V5OiBcInJldmVyc2VJdGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJldmVyc2VJdGVyKHN0YXJ0LCBlbmQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQucmV2ZXJzZUl0ZXIoc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgLy8gOjogKG51bWJlcikg4oaSIHtzdGFydDogbnVtYmVyLCBub2RlOiBOb2RlfVxuICAgIC8vIEZpbmQgdGhlIG5vZGUgdGhhdCBzaXRzIGJlZm9yZSBhIGdpdmVuIG9mZnNldC4gQ2FuIGJlIHVzZWQgdG9cbiAgICAvLyBmaW5kIG91dCB3aGljaCB0ZXh0IG5vZGUgY292ZXJzIGEgZ2l2ZW4gb2Zmc2V0LiBUaGUgYHN0YXJ0YFxuICAgIC8vIHByb3BlcnR5IG9mIHRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHN0YXJ0aW5nIG9mZnNldCBvZiB0aGVcbiAgICAvLyByZXR1cm5lZCBub2RlLiBJdCBpcyBhbiBlcnJvciB0byBjYWxsIHRoaXMgd2l0aCBvZmZzZXQgMC5cbiAgfSwge1xuICAgIGtleTogXCJjaHVua0JlZm9yZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjaHVua0JlZm9yZShvZmYpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQuY2h1bmtCZWZvcmUob2ZmKTtcbiAgICB9XG5cbiAgICAvLyA6OiAobnVtYmVyKSDihpIge3N0YXJ0OiBudW1iZXIsIG5vZGU6IE5vZGV9XG4gICAgLy8gRmluZCB0aGUgbm9kZSB0aGF0IHNpdHMgYWZ0ZXIgYSBnaXZlbiBvZmZzZXQuIFRoZSBgc3RhcnRgXG4gICAgLy8gcHJvcGVydHkgb2YgdGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgc3RhcnRpbmcgb2Zmc2V0IG9mIHRoZVxuICAgIC8vIHJldHVybmVkIG5vZGUuIEl0IGlzIGFuIGVycm9yIHRvIGNhbGwgdGhpcyB3aXRoIG9mZnNldFxuICAgIC8vIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgbm9kZS5cbiAgfSwge1xuICAgIGtleTogXCJjaHVua0FmdGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNodW5rQWZ0ZXIob2ZmKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb250ZW50LmNodW5rQWZ0ZXIob2ZmKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoKG5vZGU6IE5vZGUsIHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKSlcbiAgICAvLyBDYWxsIHRoZSBnaXZlbiBmdW5jdGlvbiBmb3IgZWFjaCBjaGlsZCBub2RlLiBUaGUgZnVuY3Rpb24gd2lsbCBiZVxuICAgIC8vIGdpdmVuIHRoZSBub2RlLCBhcyB3ZWxsIGFzIGl0cyBzdGFydCBhbmQgZW5kIG9mZnNldHMsIGFzXG4gICAgLy8gYXJndW1lbnRzLlxuICB9LCB7XG4gICAga2V5OiBcImZvckVhY2hcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZm9yRWFjaChmKSB7XG4gICAgICB0aGlzLmNvbnRlbnQuZm9yRWFjaChmKTtcbiAgICB9XG5cbiAgICAvLyA6OiBzdHJpbmdcbiAgICAvLyBDb25jYXRlbmF0ZSBhbGwgdGhlIHRleHQgbm9kZXMgZm91bmQgaW4gdGhpcyBmcmFnbWVudCBhbmQgaXRzXG4gICAgLy8gY2hpbGRyZW4uXG4gIH0sIHtcbiAgICBrZXk6IFwic2FtZU1hcmt1cFwiLFxuXG4gICAgLy8gOjogKE5vZGUpIOKGkiBib29sXG4gICAgLy8gQ29tcGFyZSB0aGUgbWFya3VwICh0eXBlLCBhdHRyaWJ1dGVzLCBhbmQgbWFya3MpIG9mIHRoaXMgbm9kZSB0b1xuICAgIC8vIHRob3NlIG9mIGFub3RoZXIuIFJldHVybnMgYHRydWVgIGlmIGJvdGggaGF2ZSB0aGUgc2FtZSBtYXJrdXAuXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNhbWVNYXJrdXAob3RoZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhc01hcmt1cChvdGhlci50eXBlLCBvdGhlci5hdHRycywgb3RoZXIubWFya3MpO1xuICAgIH1cblxuICAgIC8vIDo6IChOb2RlVHlwZSwgP09iamVjdCwgP1tNYXJrXSkg4oaSIGJvb2xcbiAgICAvLyBDaGVjayB3aGV0aGVyIHRoaXMgbm9kZSdzIG1hcmt1cCBjb3JyZXNwb25kIHRvIHRoZSBnaXZlbiB0eXBlLFxuICAgIC8vIGF0dHJpYnV0ZXMsIGFuZCBtYXJrcy5cbiAgfSwge1xuICAgIGtleTogXCJoYXNNYXJrdXBcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFzTWFya3VwKHR5cGUsIGF0dHJzLCBtYXJrcykge1xuICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PSB0eXBlICYmIE5vZGUuc2FtZUF0dHJzKHRoaXMuYXR0cnMsIGF0dHJzIHx8IGVtcHR5QXR0cnMpICYmIF9tYXJrLk1hcmsuc2FtZVNldCh0aGlzLm1hcmtzLCBtYXJrcyB8fCBlbXB0eUFycmF5KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29weVwiLFxuXG4gICAgLy8gOjogKD9GcmFnbWVudCkg4oaSIE5vZGVcbiAgICAvLyBDcmVhdGUgYSBuZXcgbm9kZSB3aXRoIHRoZSBzYW1lIG1hcmt1cCBhcyB0aGlzIG5vZGUsIGNvbnRhaW5pbmdcbiAgICAvLyB0aGUgZ2l2ZW4gY29udGVudCAob3IgZW1wdHksIGlmIG5vIGNvbnRlbnQgaXMgZ2l2ZW4pLlxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb3B5KCkge1xuICAgICAgdmFyIGNvbnRlbnQgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyBudWxsIDogYXJndW1lbnRzWzBdO1xuXG4gICAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy50eXBlLCB0aGlzLmF0dHJzLCBjb250ZW50LCB0aGlzLm1hcmtzKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoW01hcmtdKSDihpIgTm9kZVxuICAgIC8vIENyZWF0ZSBhIGNvcHkgb2YgdGhpcyBub2RlLCB3aXRoIHRoZSBnaXZlbiBzZXQgb2YgbWFya3MgaW5zdGVhZFxuICAgIC8vIG9mIHRoZSBub2RlJ3Mgb3duIG1hcmtzLlxuICB9LCB7XG4gICAga2V5OiBcIm1hcmtcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWFyayhtYXJrcykge1xuICAgICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMudHlwZSwgdGhpcy5hdHRycywgdGhpcy5jb250ZW50LCBtYXJrcyk7XG4gICAgfVxuXG4gICAgLy8gOjogKG51bWJlciwgP251bWJlcikg4oaSIE5vZGVcbiAgICAvLyBDcmVhdGUgYSBjb3B5IG9mIHRoaXMgbm9kZSB3aXRoIG9ubHkgdGhlIGNvbnRlbnQgYmV0d2VlbiB0aGVcbiAgICAvLyBnaXZlbiBvZmZzZXRzLiBJZiBgdG9gIGlzIG5vdCBnaXZlbiwgaXQgZGVmYXVsdHMgdG8gdGhlIGVuZCBvZlxuICAgIC8vIHRoZSBub2RlLlxuICB9LCB7XG4gICAga2V5OiBcInNsaWNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNsaWNlKGZyb20sIHRvKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb3B5KHRoaXMuY29udGVudC5zbGljZShmcm9tLCB0bykpO1xuICAgIH1cblxuICAgIC8vIDo6IChudW1iZXIsIG51bWJlciwgRnJhZ21lbnQpIOKGkiBOb2RlXG4gICAgLy8gQ3JlYXRlIGEgY29weSBvZiB0aGlzIG5vZGUgd2l0aCB0aGUgY29udGVudCBiZXR3ZWVuIHRoZSBnaXZlblxuICAgIC8vIG9mZnNldHMgcmVwbGFjZWQgYnkgdGhlIGdpdmVuIGZyYWdtZW50LlxuICB9LCB7XG4gICAga2V5OiBcInNwbGljZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzcGxpY2UoZnJvbSwgdG8sIHJlcGxhY2UpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvcHkodGhpcy5jb250ZW50LnNsaWNlKDAsIGZyb20pLmFwcGVuZChyZXBsYWNlKS5hcHBlbmQodGhpcy5jb250ZW50LnNsaWNlKHRvKSkpO1xuICAgIH1cblxuICAgIC8vIDo6IChGcmFnbWVudCwgP251bWJlciwgP251bWJlcikg4oaSIE5vZGVcbiAgICAvLyBbQXBwZW5kXSgjRnJhZ21lbnQuYXBwZW5kKSB0aGUgZ2l2ZW4gZnJhZ21lbnQgdG8gdGhpcyBub2RlJ3NcbiAgICAvLyBjb250ZW50LCBhbmQgY3JlYXRlIGEgbmV3IG5vZGUgd2l0aCB0aGUgcmVzdWx0LlxuICB9LCB7XG4gICAga2V5OiBcImFwcGVuZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhcHBlbmQoZnJhZ21lbnQpIHtcbiAgICAgIHZhciBqb2luTGVmdCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IDAgOiBhcmd1bWVudHNbMV07XG4gICAgICB2YXIgam9pblJpZ2h0ID0gYXJndW1lbnRzLmxlbmd0aCA8PSAyIHx8IGFyZ3VtZW50c1syXSA9PT0gdW5kZWZpbmVkID8gMCA6IGFyZ3VtZW50c1syXTtcblxuICAgICAgcmV0dXJuIHRoaXMuY29weSh0aGlzLmNvbnRlbnQuYXBwZW5kKGZyYWdtZW50LCBqb2luTGVmdCwgam9pblJpZ2h0KSk7XG4gICAgfVxuXG4gICAgLy8gOjogKG51bWJlciwgTm9kZSkg4oaSIE5vZGVcbiAgICAvLyBSZXR1cm4gYSBjb3B5IG9mIHRoaXMgbm9kZSB3aXRoIHRoZSBjaGlsZCBhdCB0aGUgZ2l2ZW4gb2Zmc2V0XG4gICAgLy8gcmVwbGFjZWQgYnkgdGhlIGdpdmVuIG5vZGUuICoqTm90ZSoqOiBUaGUgb2Zmc2V0IHNob3VsZCBub3QgZmFsbFxuICAgIC8vIHdpdGhpbiBhIHRleHQgbm9kZS5cbiAgfSwge1xuICAgIGtleTogXCJyZXBsYWNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlcGxhY2UocG9zLCBub2RlKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb3B5KHRoaXMuY29udGVudC5yZXBsYWNlKHBvcywgbm9kZSkpO1xuICAgIH1cblxuICAgIC8vIDo6IChbbnVtYmVyXSwgTm9kZSkg4oaSIE5vZGVcbiAgICAvLyBSZXR1cm4gYSBjb3B5IG9mIHRoaXMgbm9kZSB3aXRoIHRoZSBkZXNjZW5kYW50IGF0IGBwYXRoYCByZXBsYWNlZFxuICAgIC8vIGJ5IHRoZSBnaXZlbiByZXBsYWNlbWVudCBub2RlLiBUaGlzIHdpbGwgY29weSBhcyBtYW55IHN1Yi1ub2RlcyBhc1xuICAgIC8vIHRoZXJlIGFyZSBlbGVtZW50cyBpbiBgcGF0aGAuXG4gIH0sIHtcbiAgICBrZXk6IFwicmVwbGFjZURlZXBcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVwbGFjZURlZXAocGF0aCwgbm9kZSkge1xuICAgICAgdmFyIGRlcHRoID0gYXJndW1lbnRzLmxlbmd0aCA8PSAyIHx8IGFyZ3VtZW50c1syXSA9PT0gdW5kZWZpbmVkID8gMCA6IGFyZ3VtZW50c1syXTtcblxuICAgICAgaWYgKGRlcHRoID09IHBhdGgubGVuZ3RoKSByZXR1cm4gbm9kZTtcbiAgICAgIHZhciBwb3MgPSBwYXRoW2RlcHRoXTtcbiAgICAgIHJldHVybiB0aGlzLnJlcGxhY2UocG9zLCB0aGlzLmNoaWxkKHBvcykucmVwbGFjZURlZXAocGF0aCwgbm9kZSwgZGVwdGggKyAxKSk7XG4gICAgfVxuXG4gICAgLy8gOjogKG51bWJlciwgc3RyaW5nKSDihpIgTm9kZVxuICAgIC8vIOKAnENsb3Nl4oCdIHRoaXMgbm9kZSBieSBtYWtpbmcgc3VyZSB0aGF0LCBpZiBpdCBpcyBlbXB0eSwgYW5kIGlzIG5vdFxuICAgIC8vIGFsbG93ZWQgdG8gYmUgc28sIGl0IGhhcyBpdHMgZGVmYXVsdCBjb250ZW50IGluc2VydGVkLiBXaGVuIGRlcHRoXG4gICAgLy8gaXMgZ3JlYXRlciB0aGFuIHplcm8sIHN1Yi1ub2RlcyBhdCB0aGUgZ2l2ZW4gc2lkZSAod2hpY2ggY2FuIGJlXG4gICAgLy8gYFwic3RhcnRcImAgb3IgYFwiZW5kXCJgKSBhcmUgY2xvc2VkIHRvby4gUmV0dXJucyBpdHNlbGYgaWYgbm8gd29ya1xuICAgIC8vIGlzIG5lY2Vzc2FyeSwgb3IgYSBjbG9zZWQgY29weSBpZiBzb21ldGhpbmcgZGlkIG5lZWQgdG8gaGFwcGVuLlxuICB9LCB7XG4gICAga2V5OiBcImNsb3NlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNsb3NlKGRlcHRoLCBzaWRlKSB7XG4gICAgICBpZiAoZGVwdGggPT0gMCAmJiB0aGlzLnNpemUgPT0gMCAmJiAhdGhpcy50eXBlLmNhbkJlRW1wdHkpIHJldHVybiB0aGlzLmNvcHkodGhpcy50eXBlLmRlZmF1bHRDb250ZW50KCkpO1xuICAgICAgdmFyIGNsb3NlZENvbnRlbnQgPSB1bmRlZmluZWQ7XG4gICAgICBpZiAoZGVwdGggPiAwICYmIChjbG9zZWRDb250ZW50ID0gdGhpcy5jb250ZW50LmNsb3NlKGRlcHRoIC0gMSwgc2lkZSkpICE9IHRoaXMuY29udGVudCkgcmV0dXJuIHRoaXMuY29weShjbG9zZWRDb250ZW50KTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIDo6IChbbnVtYmVyXSkg4oaSIE5vZGVcbiAgICAvLyBHZXQgdGhlIGRlc2NlbmRhbnQgbm9kZSBhdCB0aGUgZ2l2ZW4gcGF0aCwgd2hpY2ggaXMgaW50ZXJwcmV0ZWRcbiAgICAvLyBhcyBhIHNlcmllcyBvZiBvZmZzZXRzIGludG8gc3VjY2Vzc2l2ZWx5IGRlZXBlciBub2Rlcy5cbiAgfSwge1xuICAgIGtleTogXCJwYXRoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhdGgoX3BhdGgpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBub2RlID0gdGhpczsgaSA8IF9wYXRoLmxlbmd0aDsgbm9kZSA9IG5vZGUuY2hpbGQoX3BhdGhbaV0pLCBpKyspIHt9XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG5cbiAgICAvLyA6OiAoUG9zKSDihpIgTm9kZVxuICAgIC8vIEdldCB0aGUgbm9kZSBhZnRlciB0aGUgZ2l2ZW4gcG9zaXRpb24uXG4gIH0sIHtcbiAgICBrZXk6IFwibm9kZUFmdGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5vZGVBZnRlcihwb3MpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhdGgocG9zLnBhdGgpLmNoaWxkKHBvcy5vZmZzZXQpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwYXRoTm9kZXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGF0aE5vZGVzKHBhdGgpIHtcbiAgICAgIHZhciBub2RlcyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGUgPSB0aGlzOzsgaSsrKSB7XG4gICAgICAgIG5vZGVzLnB1c2gobm9kZSk7XG4gICAgICAgIGlmIChpID09IHBhdGgubGVuZ3RoKSBicmVhaztcbiAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGQocGF0aFtpXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbm9kZXM7XG4gICAgfVxuXG4gICAgLy8gOjogKFBvcywgP2Jvb2wpIOKGkiBib29sXG4gICAgLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHBvc2l0aW9uIGlzIHZhbGlkIGluIHRoaXMgbm9kZS4gV2hlblxuICAgIC8vIGByZXF1aXJlVGV4dGJsb2NrYCBpcyB0cnVlLCBvbmx5IHBvc2l0aW9ucyBpbnNpZGUgdGV4dGJsb2NrcyBhcmVcbiAgICAvLyBjb25zaWRlcmVkIHZhbGlkLlxuICB9LCB7XG4gICAga2V5OiBcImlzVmFsaWRQb3NcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXNWYWxpZFBvcyhwb3MsIHJlcXVpcmVUZXh0YmxvY2spIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBub2RlID0gdGhpczs7IGkrKykge1xuICAgICAgICBpZiAoaSA9PSBwb3MucGF0aC5sZW5ndGgpIHtcbiAgICAgICAgICBpZiAocmVxdWlyZVRleHRibG9jayAmJiAhbm9kZS5pc1RleHRibG9jaykgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIHJldHVybiBwb3Mub2Zmc2V0IDw9IG5vZGUuc2l6ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgbiA9IHBvcy5wYXRoW2ldO1xuICAgICAgICAgIGlmIChuID49IG5vZGUuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIG5vZGUgPSBub2RlLmNoaWxkKG4pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gOjogKFBvcywgUG9zKSDihpIge2Zyb206IFBvcywgdG86IFBvc31cbiAgICAvLyBGaW5kcyB0aGUgbmFycm93ZXN0IHNpYmxpbmcgcmFuZ2UgKHR3byBwb3NpdGlvbnMgdGhhdCBib3RoIHBvaW50XG4gICAgLy8gaW50byB0aGUgc2FtZSBub2RlKSB0aGF0IGVuY2xvc2VzIHRoZSBnaXZlbiBwb3NpdGlvbnMuXG4gIH0sIHtcbiAgICBrZXk6IFwic2libGluZ1JhbmdlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNpYmxpbmdSYW5nZShmcm9tLCB0bykge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGUgPSB0aGlzOzsgaSsrKSB7XG4gICAgICAgIGlmIChub2RlLmlzVGV4dGJsb2NrKSB7XG4gICAgICAgICAgdmFyIHBhdGggPSBmcm9tLnBhdGguc2xpY2UoMCwgaSAtIDEpLFxuICAgICAgICAgICAgICBvZmZzZXQgPSBmcm9tLnBhdGhbaSAtIDFdO1xuICAgICAgICAgIHJldHVybiB7IGZyb206IG5ldyBfcG9zLlBvcyhwYXRoLCBvZmZzZXQpLCB0bzogbmV3IF9wb3MuUG9zKHBhdGgsIG9mZnNldCArIDEpIH07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGZyb21FbmQgPSBpID09IGZyb20ucGF0aC5sZW5ndGgsXG4gICAgICAgICAgICB0b0VuZCA9IGkgPT0gdG8ucGF0aC5sZW5ndGg7XG4gICAgICAgIHZhciBsZWZ0ID0gZnJvbUVuZCA/IGZyb20ub2Zmc2V0IDogZnJvbS5wYXRoW2ldO1xuICAgICAgICB2YXIgcmlnaHQgPSB0b0VuZCA/IHRvLm9mZnNldCA6IHRvLnBhdGhbaV07XG4gICAgICAgIGlmIChmcm9tRW5kIHx8IHRvRW5kIHx8IGxlZnQgIT0gcmlnaHQpIHtcbiAgICAgICAgICB2YXIgcGF0aCA9IGZyb20ucGF0aC5zbGljZSgwLCBpKTtcbiAgICAgICAgICByZXR1cm4geyBmcm9tOiBuZXcgX3Bvcy5Qb3MocGF0aCwgbGVmdCksIHRvOiBuZXcgX3Bvcy5Qb3MocGF0aCwgcmlnaHQgKyAodG9FbmQgPyAwIDogMSkpIH07XG4gICAgICAgIH1cbiAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGQobGVmdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gOjogKD9Qb3MsID9Qb3MsIChub2RlOiBOb2RlLCBwYXRoOiBbbnVtYmVyXSwgcGFyZW50OiBOb2RlKSlcbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIG5vZGVzIGJldHdlZW4gdGhlIGdpdmVuIHR3byBwb3NpdGlvbnMsIGNhbGxpbmdcbiAgICAvLyB0aGUgY2FsbGJhY2sgd2l0aCB0aGUgbm9kZSwgdGhlIHBhdGggdG93YXJkcyBpdCwgYW5kIGl0cyBwYXJlbnRcbiAgICAvLyBub2RlLCBhcyBhcmd1bWVudHMuIGBmcm9tYCBhbmQgYHRvYCBtYXkgYmUgYG51bGxgIHRvIGRlbm90ZVxuICAgIC8vIHN0YXJ0aW5nIGF0IHRoZSBzdGFydCBvZiB0aGUgbm9kZSBvciBlbmRpbmcgYXQgaXRzIGVuZC4gTm90ZSB0aGF0XG4gICAgLy8gdGhlIHBhdGggcGFzc2VkIHRvIHRoZSBjYWxsYmFjayBpcyBtdXRhdGVkIGFzIGl0ZXJhdGlvblxuICAgIC8vIGNvbnRpbnVlcywgc28gaWYgeW91IHdhbnQgdG8gcHJlc2VydmUgaXQsIG1ha2UgYSBjb3B5LlxuICB9LCB7XG4gICAga2V5OiBcIm5vZGVzQmV0d2VlblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBub2Rlc0JldHdlZW4oZnJvbSwgdG8sIGYpIHtcbiAgICAgIHZhciBwYXRoID0gYXJndW1lbnRzLmxlbmd0aCA8PSAzIHx8IGFyZ3VtZW50c1szXSA9PT0gdW5kZWZpbmVkID8gW10gOiBhcmd1bWVudHNbM107XG4gICAgICB2YXIgcGFyZW50ID0gYXJndW1lbnRzLmxlbmd0aCA8PSA0IHx8IGFyZ3VtZW50c1s0XSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGFyZ3VtZW50c1s0XTtcblxuICAgICAgaWYgKGYodGhpcywgcGF0aCwgcGFyZW50KSA9PT0gZmFsc2UpIHJldHVybjtcbiAgICAgIHRoaXMuY29udGVudC5ub2Rlc0JldHdlZW4oZnJvbSwgdG8sIGYsIHBhdGgsIHRoaXMpO1xuICAgIH1cblxuICAgIC8vIDo6ICg/UG9zLCA/UG9zLCAobm9kZTogTm9kZSwgcGF0aDogW251bWJlcl0sIHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyLCBwYXJlbnQ6IE5vZGUpKVxuICAgIC8vIENhbGxzIHRoZSBnaXZlbiBmdW5jdGlvbiBmb3IgZWFjaCBpbmxpbmUgbm9kZSBiZXR3ZWVuIHRoZSB0d29cbiAgICAvLyBnaXZlbiBwb3NpdGlvbnMuIFBhc3MgbnVsbCBmb3IgYGZyb21gIG9yIGB0b2AgdG8gc3RhcnQgb3IgZW5kIGF0XG4gICAgLy8gdGhlIHN0YXJ0IG9yIGVuZCBvZiB0aGUgbm9kZS5cbiAgfSwge1xuICAgIGtleTogXCJpbmxpbmVOb2Rlc0JldHdlZW5cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5saW5lTm9kZXNCZXR3ZWVuKGZyb20sIHRvLCBmKSB7XG4gICAgICB0aGlzLm5vZGVzQmV0d2Vlbihmcm9tLCB0bywgZnVuY3Rpb24gKG5vZGUsIHBhdGgsIHBhcmVudCkge1xuICAgICAgICBpZiAobm9kZS5pc0lubGluZSkge1xuICAgICAgICAgIHZhciBsYXN0ID0gcGF0aC5sZW5ndGggLSAxO1xuICAgICAgICAgIGYobm9kZSwgcGF0aC5zbGljZSgwLCBsYXN0KSwgcGF0aFtsYXN0XSwgcGF0aFtsYXN0XSArIG5vZGUud2lkdGgsIHBhcmVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIDo6ICg/UG9zLCA/UG9zKSDihpIgTm9kZVxuICAgIC8vIFJldHVybnMgYSBjb3B5IG9mIHRoaXMgbm9kZSBjb250YWluaW5nIG9ubHkgdGhlIGNvbnRlbnQgYmV0d2VlblxuICAgIC8vIGBmcm9tYCBhbmQgYHRvYC4gWW91IGNhbiBwYXNzIGBudWxsYCBmb3IgZWl0aGVyIG9mIHRoZW0gdG8gc3RhcnRcbiAgICAvLyBvciBlbmQgYXQgdGhlIHN0YXJ0IG9yIGVuZCBvZiB0aGUgbm9kZS5cbiAgfSwge1xuICAgIGtleTogXCJzbGljZUJldHdlZW5cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2xpY2VCZXR3ZWVuKGZyb20sIHRvKSB7XG4gICAgICB2YXIgZGVwdGggPSBhcmd1bWVudHMubGVuZ3RoIDw9IDIgfHwgYXJndW1lbnRzWzJdID09PSB1bmRlZmluZWQgPyAwIDogYXJndW1lbnRzWzJdO1xuXG4gICAgICByZXR1cm4gdGhpcy5jb3B5KHRoaXMuY29udGVudC5zbGljZUJldHdlZW4oZnJvbSwgdG8sIGRlcHRoKSk7XG4gICAgfVxuXG4gICAgLy8gOjogKFBvcykg4oaSIFtNYXJrXVxuICAgIC8vIEdldCB0aGUgbWFya3Mgb2YgdGhlIG5vZGUgYmVmb3JlIHRoZSBnaXZlbiBwb3NpdGlvbiBvciwgaWYgdGhhdFxuICAgIC8vIHBvc2l0aW9uIGlzIGF0IHRoZSBzdGFydCBvZiBhIG5vbi1lbXB0eSBub2RlLCB0aG9zZSBvZiB0aGUgbm9kZVxuICAgIC8vIGFmdGVyIGl0LlxuICB9LCB7XG4gICAga2V5OiBcIm1hcmtzQXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWFya3NBdChwb3MpIHtcbiAgICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhdGgocG9zLnBhdGgpO1xuICAgICAgaWYgKCFwYXJlbnQuaXNUZXh0YmxvY2sgfHwgIXBhcmVudC5zaXplKSByZXR1cm4gZW1wdHlBcnJheTtcbiAgICAgIHJldHVybiBwYXJlbnQuY2h1bmtCZWZvcmUocG9zLm9mZnNldCB8fCAxKS5ub2RlLm1hcmtzO1xuICAgIH1cblxuICAgIC8vIDo6ICg/UG9zLCA/UG9zLCBNYXJrVHlwZSkg4oaSIGJvb2xcbiAgICAvLyBUZXN0IHdoZXRoZXIgYSBtYXJrIG9mIHRoZSBnaXZlbiB0eXBlIG9jY3VycyBpbiB0aGlzIGRvY3VtZW50XG4gICAgLy8gYmV0d2VlbiB0aGUgdHdvIGdpdmVuIHBvc2l0aW9ucy5cbiAgfSwge1xuICAgIGtleTogXCJyYW5nZUhhc01hcmtcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmFuZ2VIYXNNYXJrKGZyb20sIHRvLCB0eXBlKSB7XG4gICAgICB2YXIgZm91bmQgPSBmYWxzZTtcbiAgICAgIHRoaXMubm9kZXNCZXR3ZWVuKGZyb20sIHRvLCBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICBpZiAodHlwZS5pc0luU2V0KG5vZGUubWFya3MpKSBmb3VuZCA9IHRydWU7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBmb3VuZDtcbiAgICB9XG5cbiAgICAvLyA6OiBib29sXG4gICAgLy8gVHJ1ZSB3aGVuIHRoaXMgaXMgYSBibG9jayAobm9uLWlubGluZSBub2RlKVxuICB9LCB7XG4gICAga2V5OiBcInRvU3RyaW5nXCIsXG5cbiAgICAvLyA6OiAoKSDihpIgc3RyaW5nXG4gICAgLy8gUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgbm9kZSBmb3IgZGVidWdnaW5nXG4gICAgLy8gcHVycG9zZXMuXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgdmFyIG5hbWUgPSB0aGlzLnR5cGUubmFtZTtcbiAgICAgIGlmICh0aGlzLmNvbnRlbnQuc2l6ZSkgbmFtZSArPSBcIihcIiArIHRoaXMuY29udGVudC50b1N0cmluZygpICsgXCIpXCI7XG4gICAgICByZXR1cm4gd3JhcE1hcmtzKHRoaXMubWFya3MsIG5hbWUpO1xuICAgIH1cblxuICAgIC8vIDo6ICgpIOKGkiBPYmplY3RcbiAgICAvLyBSZXR1cm4gYSBKU09OLXNlcmlhbGl6ZWFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBub2RlLlxuICB9LCB7XG4gICAga2V5OiBcInRvSlNPTlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b0pTT04oKSB7XG4gICAgICB2YXIgb2JqID0geyB0eXBlOiB0aGlzLnR5cGUubmFtZSB9O1xuICAgICAgZm9yICh2YXIgXyBpbiB0aGlzLmF0dHJzKSB7XG4gICAgICAgIG9iai5hdHRycyA9IHRoaXMuYXR0cnM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc2l6ZSkgb2JqLmNvbnRlbnQgPSB0aGlzLmNvbnRlbnQudG9KU09OKCk7XG4gICAgICBpZiAodGhpcy5tYXJrcy5sZW5ndGgpIG9iai5tYXJrcyA9IHRoaXMubWFya3MubWFwKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgIHJldHVybiBuLnRvSlNPTigpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH1cblxuICAgIC8vIFRoaXMgaXMgYSBoYWNrIHRvIGJlIGFibGUgdG8gdHJlYXQgYSBub2RlIG9iamVjdCBhcyBhbiBpdGVyYXRvciByZXN1bHRcbiAgfSwge1xuICAgIGtleTogXCJzaXplXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb250ZW50LnNpemU7XG4gICAgfVxuXG4gICAgLy8gOjogbnVtYmVyXG4gICAgLy8gVGhlIHdpZHRoIG9mIHRoaXMgbm9kZS4gQWx3YXlzIDEgZm9yIG5vbi10ZXh0IG5vZGVzLCBhbmQgdGhlXG4gICAgLy8gbGVuZ3RoIG9mIHRoZSB0ZXh0IGZvciB0ZXh0IG5vZGVzLlxuICB9LCB7XG4gICAga2V5OiBcIndpZHRoXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidGV4dENvbnRlbnRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQudGV4dENvbnRlbnQ7XG4gICAgfVxuXG4gICAgLy8gOjogP05vZGVcbiAgICAvLyBSZXR1cm5zIHRoaXMgbm9kZSdzIGZpcnN0IGNoaWxkLCBvciBgbnVsbGAgaWYgdGhlcmUgYXJlIG5vXG4gICAgLy8gY2hpbGRyZW4uXG4gIH0sIHtcbiAgICBrZXk6IFwiZmlyc3RDaGlsZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGVudC5maXJzdENoaWxkO1xuICAgIH1cblxuICAgIC8vIDo6ID9Ob2RlXG4gICAgLy8gUmV0dXJucyB0aGlzIG5vZGUncyBsYXN0IGNoaWxkLCBvciBgbnVsbGAgaWYgdGhlcmUgYXJlIG5vXG4gICAgLy8gY2hpbGRyZW4uXG4gIH0sIHtcbiAgICBrZXk6IFwibGFzdENoaWxkXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb250ZW50Lmxhc3RDaGlsZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNCbG9ja1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMudHlwZS5pc0Jsb2NrO1xuICAgIH1cblxuICAgIC8vIDo6IGJvb2xcbiAgICAvLyBUcnVlIHdoZW4gdGhpcyBpcyBhIHRleHRibG9jayBub2RlLCBhIGJsb2NrIG5vZGUgd2l0aCBpbmxpbmVcbiAgICAvLyBjb250ZW50LlxuICB9LCB7XG4gICAga2V5OiBcImlzVGV4dGJsb2NrXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy50eXBlLmlzVGV4dGJsb2NrO1xuICAgIH1cblxuICAgIC8vIDo6IGJvb2xcbiAgICAvLyBUcnVlIHdoZW4gdGhpcyBpcyBhbiBpbmxpbmUgbm9kZSAoYSB0ZXh0IG5vZGUgb3IgYSBub2RlIHRoYXQgY2FuXG4gICAgLy8gYXBwZWFyIGFtb25nIHRleHQpLlxuICB9LCB7XG4gICAga2V5OiBcImlzSW5saW5lXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy50eXBlLmlzSW5saW5lO1xuICAgIH1cblxuICAgIC8vIDo6IGJvb2xcbiAgICAvLyBUcnVlIHdoZW4gdGhpcyBpcyBhIHRleHQgbm9kZS5cbiAgfSwge1xuICAgIGtleTogXCJpc1RleHRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnR5cGUuaXNUZXh0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ2YWx1ZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gOjogKFNjaGVtYSwgT2JqZWN0KSDihpIgTm9kZVxuICAgIC8vIERlc2VyaWFsaXplIGEgbm9kZSBmcm9tIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uLlxuICB9XSwgW3tcbiAgICBrZXk6IFwic2FtZUF0dHJzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNhbWVBdHRycyhhLCBiKSB7XG4gICAgICBpZiAoYSA9PSBiKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGZvciAodmFyIHByb3AgaW4gYSkge1xuICAgICAgICBpZiAoYVtwcm9wXSAhPT0gYltwcm9wXSkgcmV0dXJuIGZhbHNlO1xuICAgICAgfXJldHVybiB0cnVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJmcm9tSlNPTlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICAgIHZhciB0eXBlID0gc2NoZW1hLm5vZGVUeXBlKGpzb24udHlwZSk7XG4gICAgICB2YXIgY29udGVudCA9IGpzb24udGV4dCAhPSBudWxsID8ganNvbi50ZXh0IDogX2ZyYWdtZW50LkZyYWdtZW50LmZyb21KU09OKHNjaGVtYSwganNvbi5jb250ZW50KTtcbiAgICAgIHJldHVybiB0eXBlLmNyZWF0ZShqc29uLmF0dHJzLCBjb250ZW50LCBqc29uLm1hcmtzICYmIGpzb24ubWFya3MubWFwKHNjaGVtYS5tYXJrRnJvbUpTT04pKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gTm9kZTtcbn0pKCk7XG5cbmV4cG9ydHMuTm9kZSA9IE5vZGU7XG5cbmlmICh0eXBlb2YgU3ltYm9sICE9IFwidW5kZWZpbmVkXCIpIHtcbiAgLy8gOjogKCkg4oaSIEl0ZXJhdG9yPE5vZGU+XG4gIC8vIEEgZnJhZ21lbnQgaXMgaXRlcmFibGUsIGluIHRoZSBFUzYgc2Vuc2UuXG4gIE5vZGUucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXRlcigpO1xuICB9O1xufVxuXG4vLyA7OyAjZm9yd2FyZD1Ob2RlXG5cbnZhciBUZXh0Tm9kZSA9IChmdW5jdGlvbiAoX05vZGUpIHtcbiAgX2luaGVyaXRzKFRleHROb2RlLCBfTm9kZSk7XG5cbiAgZnVuY3Rpb24gVGV4dE5vZGUodHlwZSwgYXR0cnMsIGNvbnRlbnQsIG1hcmtzKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRleHROb2RlKTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKFRleHROb2RlLnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuY2FsbCh0aGlzLCB0eXBlLCBhdHRycywgbnVsbCwgbWFya3MpO1xuICAgIC8vIDo6ID9zdHJpbmdcbiAgICAvLyBGb3IgdGV4dCBub2RlcywgdGhpcyBjb250YWlucyB0aGUgbm9kZSdzIHRleHQgY29udGVudC5cbiAgICB0aGlzLnRleHQgPSBjb250ZW50O1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFRleHROb2RlLCBbe1xuICAgIGtleTogXCJ0b1N0cmluZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICAgIHJldHVybiB3cmFwTWFya3ModGhpcy5tYXJrcywgSlNPTi5zdHJpbmdpZnkodGhpcy50ZXh0KSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm1hcmtcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWFyayhtYXJrcykge1xuICAgICAgcmV0dXJuIG5ldyBUZXh0Tm9kZSh0aGlzLnR5cGUsIHRoaXMuYXR0cnMsIHRoaXMudGV4dCwgbWFya3MpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0b0pTT05cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9KU09OKCkge1xuICAgICAgdmFyIGJhc2UgPSBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihUZXh0Tm9kZS5wcm90b3R5cGUpLCBcInRvSlNPTlwiLCB0aGlzKS5jYWxsKHRoaXMpO1xuICAgICAgYmFzZS50ZXh0ID0gdGhpcy50ZXh0O1xuICAgICAgcmV0dXJuIGJhc2U7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRleHRDb250ZW50XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy50ZXh0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ3aWR0aFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMudGV4dC5sZW5ndGg7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFRleHROb2RlO1xufSkoTm9kZSk7XG5cbmV4cG9ydHMuVGV4dE5vZGUgPSBUZXh0Tm9kZTtcblxuZnVuY3Rpb24gd3JhcE1hcmtzKG1hcmtzLCBzdHIpIHtcbiAgZm9yICh2YXIgaSA9IG1hcmtzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgc3RyID0gbWFya3NbaV0udHlwZS5uYW1lICsgXCIoXCIgKyBzdHIgKyBcIilcIjtcbiAgfXJldHVybiBzdHI7XG59IiwiLy8gOzsgSW5zdGFuY2VzIG9mIHRoZSBgUG9zYCBjbGFzcyByZXByZXNlbnQgcG9zaXRpb25zIGluIGEgZG9jdW1lbnQuXG4vLyBBIHBvc2l0aW9uIGFuIGFycmF5IG9mIGludGVnZXJzIHRoYXQgZGVzY3JpYmUgYSBwYXRoIHRvIHRoZSB0YXJnZXRcbi8vIG5vZGUgKHNlZSBgTm9kZS5wYXRoYCkgYW5kIGFuIGludGVnZXIgb2Zmc2V0IGludG8gdGhhdCB0YXJnZXQgbm9kZS5cblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIFBvcyA9IChmdW5jdGlvbiAoKSB7XG4gIC8vIDo6IChwYXRoOiBbbnVtYmVyXSwgbnVtYmVyKVxuXG4gIGZ1bmN0aW9uIFBvcyhwYXRoLCBvZmZzZXQpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUG9zKTtcblxuICAgIC8vIDo6IFtudW1iZXJdIFRoZSBwYXRoIHRvIHRoZSB0YXJnZXQgbm9kZS5cbiAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgIC8vIDo6IG51bWJlciBUaGUgb2Zmc2V0IGludG8gdGhlIHRhcmdldCBub2RlLlxuICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0O1xuICB9XG5cbiAgLy8gOzsgUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwYXRoIG9mIHRoZSBmb3JtXG4gIC8vIGBcIjAvMjoxMFwiYCwgd2hlcmUgdGhlIG51bWJlcnMgYmVmb3JlIHRoZSBjb2xvbiBhcmUgdGhlIHBhdGgsIGFuZFxuICAvLyB0aGUgbnVtYmVyIGFmdGVyIGl0IGlzIHRoZSBvZmZzZXQuXG5cbiAgX2NyZWF0ZUNsYXNzKFBvcywgW3tcbiAgICBrZXk6IFwidG9TdHJpbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXRoLmpvaW4oXCIvXCIpICsgXCI6XCIgKyB0aGlzLm9mZnNldDtcbiAgICB9XG5cbiAgICAvLyA6OiBudW1iZXJcbiAgICAvLyBUaGUgbGVuZ3RoIG9mIHRoZSBwb3NpdGlvbidzIHBhdGguXG4gIH0sIHtcbiAgICBrZXk6IFwibWF4XCIsXG5cbiAgICAvLyA6OiAoUG9zKSDihpIgUG9zXG4gICAgLy8gUmV0dXJuIHRoZSBncmVhdGVyIG9mIHR3byBwb3NpdGlvbnMuXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1heChvdGhlcikge1xuICAgICAgcmV0dXJuIHRoaXMuY21wKG90aGVyKSA+IDAgPyB0aGlzIDogb3RoZXI7XG4gICAgfVxuXG4gICAgLy8gOjogKFBvcykg4oaSIFBvc1xuICAgIC8vIFJldHVybiB0aGUgbGVzc2VyIG9mIHR3byBwb3NpdGlvbnMuXG4gIH0sIHtcbiAgICBrZXk6IFwibW1pblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtbWluKG90aGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5jbXAob3RoZXIpIDwgMCA/IHRoaXMgOiBvdGhlcjtcbiAgICB9XG5cbiAgICAvLyA6OiAoW251bWJlcl0sIFtudW1iZXJdKSDihpIgYm9vbFxuICAgIC8vIENvbXBhcmVzIHR3byBwYXRocyBhbmQgcmV0dXJucyB0cnVlIHdoZW4gdGhleSBhcmUgdGhlIHNhbWUuXG4gIH0sIHtcbiAgICBrZXk6IFwiY21wXCIsXG5cbiAgICAvLyA6OiAoUG9zKSDihpIgbnVtYmVyXG4gICAgLy8gQ29tcGFyZXMgdGhpcyBwb3NpdGlvbiB0byBhbm90aGVyIHBvc2l0aW9uLCBhbmQgcmV0dXJucyBhIG51bWJlci5cbiAgICAvLyBPZiB0aGlzIHJlc3VsdCBudW1iZXIsIG9ubHkgdGhlIHNpZ24gaXMgc2lnbmlmaWNhbnQuIEl0IGlzXG4gICAgLy8gbmVnYXRpdmUgaWYgdGhpcyBwb3NpdGlvbiBpcyBsZXNzIHRoYW4gdGhlIG90aGVyIG9uZSwgemVybyBpZlxuICAgIC8vIHRoZXkgYXJlIHRoZSBzYW1lLCBhbmQgcG9zaXRpdmUgaWYgdGhpcyBwb3NpdGlvbiBpcyBncmVhdGVyLlxuICAgIHZhbHVlOiBmdW5jdGlvbiBjbXAob3RoZXIpIHtcbiAgICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm4gMDtcbiAgICAgIHJldHVybiBQb3MuY21wKHRoaXMucGF0aCwgdGhpcy5vZmZzZXQsIG90aGVyLnBhdGgsIG90aGVyLm9mZnNldCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNob3J0ZW5cIixcblxuICAgIC8vIDo6ICg/bnVtYmVyLCA/bnVtYmVyKSDihpIgUG9zXG4gICAgLy8gQ3JlYXRlIGEgcG9zaXRpb24gcG9pbnRpbmcgaW50byBhIHBhcmVudCBvZiB0aGlzIHBvc2l0aW9uJ3NcbiAgICAvLyB0YXJnZXQuIFdoZW4gYHRvYCBpcyBnaXZlbiwgaXQgZGV0ZXJtaW5lcyB0aGUgbmV3IGxlbmd0aCBvZiB0aGVcbiAgICAvLyBwYXRoLiBCeSBkZWZhdWx0LCB0aGUgcGF0aCBiZWNvbWVzIG9uZSBzaG9ydGVyLiBUaGUgYG9mZnNldGBcbiAgICAvLyBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXJlIGluIHRoaXMgcGFyZW50IHRoZVxuICAgIC8vIHBvc2l0aW9uIHBvaW50cy4gQnkgZGVmYXVsdCwgaXQgcG9pbnRzIGJlZm9yZSB0aGUgb2xkIHRhcmdldC4gWW91XG4gICAgLy8gY2FuIHBhc3MgYSBuZWdhdGl2ZSBvciBwb3NpdGl2ZSBpbnRlZ2VyIHRvIG1vdmUgaXQgYmFja3dhcmQgb3JcbiAgICAvLyBmb3J3YXJkICgqKm5vdGUqKjogdGhpcyBtZXRob2QgcGVyZm9ybXMgbm8gYm91bmRzIGNoZWNraW5nKS5cbiAgICB2YWx1ZTogZnVuY3Rpb24gc2hvcnRlbigpIHtcbiAgICAgIHZhciB0byA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IG51bGwgOiBhcmd1bWVudHNbMF07XG4gICAgICB2YXIgb2Zmc2V0ID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8gMCA6IGFyZ3VtZW50c1sxXTtcblxuICAgICAgaWYgKHRvID49IHRoaXMuZGVwdGgpIHJldHVybiB0aGlzO1xuICAgICAgcmV0dXJuIFBvcy5zaG9ydGVuKHRoaXMucGF0aCwgdG8sIG9mZnNldCk7XG4gICAgfVxuXG4gICAgLy8gOjogKG51bWJlcikg4oaSIFBvc1xuICAgIC8vIENyZWF0ZSBhIHBvc2l0aW9uIHdpdGggYW4gb2Zmc2V0IG1vdmVkIHJlbGF0aXZlIHRvIHRoaXNcbiAgICAvLyBwb3NpdGlvbidzIG9mZnNldC4gRm9yIGV4YW1wbGUgbW92aW5nIGAwLzE6MTBgIGJ5IGAtMmAgeWllbGRzXG4gICAgLy8gYDAvMTo4YC5cbiAgfSwge1xuICAgIGtleTogXCJtb3ZlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1vdmUoYnkpIHtcbiAgICAgIHJldHVybiBuZXcgUG9zKHRoaXMucGF0aCwgdGhpcy5vZmZzZXQgKyBieSk7XG4gICAgfVxuXG4gICAgLy8gOjogKD9udW1iZXIpIOKGkiBbbnVtYmVyXVxuICAgIC8vIENvbnZlcnQgdGhpcyBwb3NpdGlvbiB0byBhbiBhcnJheSBvZiBudW1iZXJzIChpbmNsdWRpbmcgaXRzXG4gICAgLy8gb2Zmc2V0KS4gT3B0aW9uYWxseSBwYXNzIGFuIGFyZ3VtZW50IHRvIGFkanVzdCB0aGUgdmFsdWUgb2YgdGhlXG4gICAgLy8gb2Zmc2V0LlxuICB9LCB7XG4gICAga2V5OiBcInRvUGF0aFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b1BhdGgoKSB7XG4gICAgICB2YXIgbW92ZSA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IDAgOiBhcmd1bWVudHNbMF07XG5cbiAgICAgIHJldHVybiB0aGlzLnBhdGguY29uY2F0KHRoaXMub2Zmc2V0ICsgbW92ZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImV4dGVuZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBleHRlbmQocG9zKSB7XG4gICAgICB2YXIgcGF0aCA9IHRoaXMucGF0aC5zbGljZSgpLFxuICAgICAgICAgIGFkZCA9IHRoaXMub2Zmc2V0O1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb3MucGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgICBwYXRoLnB1c2gocG9zLnBhdGhbaV0gKyBhZGQpO1xuICAgICAgICBhZGQgPSAwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBQb3MocGF0aCwgcG9zLm9mZnNldCArIGFkZCk7XG4gICAgfVxuXG4gICAgLy8gOjogKCkg4oaSIE9iamVjdFxuICAgIC8vIENvbnZlcnQgdGhlIHBvc2l0aW9uIHRvIGEgSlNPTi1zYWZlIHJlcHJlc2VudGF0aW9uLlxuICB9LCB7XG4gICAga2V5OiBcInRvSlNPTlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b0pTT04oKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyA6OiAoW251bWJlcl0sID9udW1iZXIpIOKGkiBQb3NcbiAgICAvLyBCdWlsZCBhIHBvc2l0aW9uIGZyb20gYW4gYXJyYXkgb2YgbnVtYmVycyAoYXMgaW5cbiAgICAvLyBbYHRvUGF0aGBdKCNQb3MudG9QYXRoKSksIHRha2luZyB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBhcnJheSBhc1xuICAgIC8vIG9mZnNldCBhbmQgb3B0aW9uYWxseSBtb3ZpbmcgaXQgYnkgYG1vdmVgLlxuICB9LCB7XG4gICAga2V5OiBcImRlcHRoXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXRoLmxlbmd0aDtcbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogXCJjbXBcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY21wKHBhdGhBLCBvZmZzZXRBLCBwYXRoQiwgb2Zmc2V0Qikge1xuICAgICAgdmFyIGxlbkEgPSBwYXRoQS5sZW5ndGgsXG4gICAgICAgICAgbGVuQiA9IHBhdGhCLmxlbmd0aDtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBlbmQgPSBNYXRoLm1pbihsZW5BLCBsZW5CKTsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICAgIHZhciBkaWZmID0gcGF0aEFbaV0gLSBwYXRoQltpXTtcbiAgICAgICAgaWYgKGRpZmYgIT0gMCkgcmV0dXJuIGRpZmY7XG4gICAgICB9XG4gICAgICBpZiAobGVuQSA+IGxlbkIpIHJldHVybiBvZmZzZXRCIDw9IHBhdGhBW2ldID8gMSA6IC0xO2Vsc2UgaWYgKGxlbkIgPiBsZW5BKSByZXR1cm4gb2Zmc2V0QSA8PSBwYXRoQltpXSA/IC0xIDogMTtlbHNlIHJldHVybiBvZmZzZXRBIC0gb2Zmc2V0QjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2FtZVBhdGhcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2FtZVBhdGgocGF0aEEsIHBhdGhCKSB7XG4gICAgICBpZiAocGF0aEEubGVuZ3RoICE9IHBhdGhCLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRoQS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocGF0aEFbaV0gIT09IHBhdGhCW2ldKSByZXR1cm4gZmFsc2U7XG4gICAgICB9cmV0dXJuIHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNob3J0ZW5cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2hvcnRlbihwYXRoKSB7XG4gICAgICB2YXIgdG8gPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyBudWxsIDogYXJndW1lbnRzWzFdO1xuICAgICAgdmFyIG9mZnNldCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMiB8fCBhcmd1bWVudHNbMl0gPT09IHVuZGVmaW5lZCA/IDAgOiBhcmd1bWVudHNbMl07XG5cbiAgICAgIGlmICh0byA9PSBudWxsKSB0byA9IHBhdGgubGVuZ3RoIC0gMTtcbiAgICAgIHJldHVybiBuZXcgUG9zKHBhdGguc2xpY2UoMCwgdG8pLCBwYXRoW3RvXSArIG9mZnNldCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImZyb21cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZnJvbShhcnJheSkge1xuICAgICAgdmFyIG1vdmUgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyAwIDogYXJndW1lbnRzWzFdO1xuXG4gICAgICBpZiAoIWFycmF5Lmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgY3JlYXRlIGEgcG9zIGZyb20gYW4gZW1wdHkgYXJyYXlcIik7XG4gICAgICByZXR1cm4gbmV3IFBvcyhhcnJheS5zbGljZSgwLCBhcnJheS5sZW5ndGggLSAxKSwgYXJyYXlbYXJyYXkubGVuZ3RoIC0gMV0gKyBtb3ZlKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoT2JqZWN0KSDihpIgUG9zXG4gICAgLy8gQ3JlYXRlIGEgcG9zaXRpb24gZnJvbSBhIEpTT04gcmVwcmVzZW50YXRpb24uXG4gIH0sIHtcbiAgICBrZXk6IFwiZnJvbUpTT05cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZnJvbUpTT04oanNvbikge1xuICAgICAgcmV0dXJuIG5ldyBQb3MoanNvbi5wYXRoLCBqc29uLm9mZnNldCk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFBvcztcbn0pKCk7XG5cbmV4cG9ydHMuUG9zID0gUG9zOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3NsaWNlZFRvQXJyYXkgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBzbGljZUl0ZXJhdG9yKGFyciwgaSkgeyB2YXIgX2FyciA9IFtdOyB2YXIgX24gPSB0cnVlOyB2YXIgX2QgPSBmYWxzZTsgdmFyIF9lID0gdW5kZWZpbmVkOyB0cnkgeyBmb3IgKHZhciBfaSA9IGFycltTeW1ib2wuaXRlcmF0b3JdKCksIF9zOyAhKF9uID0gKF9zID0gX2kubmV4dCgpKS5kb25lKTsgX24gPSB0cnVlKSB7IF9hcnIucHVzaChfcy52YWx1ZSk7IGlmIChpICYmIF9hcnIubGVuZ3RoID09PSBpKSBicmVhazsgfSB9IGNhdGNoIChlcnIpIHsgX2QgPSB0cnVlOyBfZSA9IGVycjsgfSBmaW5hbGx5IHsgdHJ5IHsgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSkgX2lbXCJyZXR1cm5cIl0oKTsgfSBmaW5hbGx5IHsgaWYgKF9kKSB0aHJvdyBfZTsgfSB9IHJldHVybiBfYXJyOyB9IHJldHVybiBmdW5jdGlvbiAoYXJyLCBpKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHsgcmV0dXJuIGFycjsgfSBlbHNlIGlmIChTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGFycikpIHsgcmV0dXJuIHNsaWNlSXRlcmF0b3IoYXJyLCBpKTsgfSBlbHNlIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2VcIik7IH0gfTsgfSkoKTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG52YXIgX2dldCA9IGZ1bmN0aW9uIGdldChfeDIsIF94MywgX3g0KSB7IHZhciBfYWdhaW4gPSB0cnVlOyBfZnVuY3Rpb246IHdoaWxlIChfYWdhaW4pIHsgdmFyIG9iamVjdCA9IF94MiwgcHJvcGVydHkgPSBfeDMsIHJlY2VpdmVyID0gX3g0OyBfYWdhaW4gPSBmYWxzZTsgaWYgKG9iamVjdCA9PT0gbnVsbCkgb2JqZWN0ID0gRnVuY3Rpb24ucHJvdG90eXBlOyB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSk7IGlmIChkZXNjID09PSB1bmRlZmluZWQpIHsgdmFyIHBhcmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmplY3QpOyBpZiAocGFyZW50ID09PSBudWxsKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gZWxzZSB7IF94MiA9IHBhcmVudDsgX3gzID0gcHJvcGVydHk7IF94NCA9IHJlY2VpdmVyOyBfYWdhaW4gPSB0cnVlOyBkZXNjID0gcGFyZW50ID0gdW5kZWZpbmVkOyBjb250aW51ZSBfZnVuY3Rpb247IH0gfSBlbHNlIGlmIChcInZhbHVlXCIgaW4gZGVzYykgeyByZXR1cm4gZGVzYy52YWx1ZTsgfSBlbHNlIHsgdmFyIGdldHRlciA9IGRlc2MuZ2V0OyBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSByZXR1cm4gZ2V0dGVyLmNhbGwocmVjZWl2ZXIpOyB9IH0gfTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbnZhciBfbm9kZSA9IHJlcXVpcmUoXCIuL25vZGVcIik7XG5cbnZhciBfZnJhZ21lbnQgPSByZXF1aXJlKFwiLi9mcmFnbWVudFwiKTtcblxudmFyIF9tYXJrID0gcmVxdWlyZShcIi4vbWFya1wiKTtcblxudmFyIF91dGlsRXJyb3IgPSByZXF1aXJlKFwiLi4vdXRpbC9lcnJvclwiKTtcblxuLy8gOzsgI3RvYz1mYWxzZSBUaGUgZXhjZXB0aW9uIHR5cGUgdXNlZCB0byBzaWduYWwgc2NoZW1hLXJlbGF0ZWRcbi8vIGVycm9ycy5cblxudmFyIFNjaGVtYUVycm9yID0gKGZ1bmN0aW9uIChfUHJvc2VNaXJyb3JFcnJvcikge1xuICBfaW5oZXJpdHMoU2NoZW1hRXJyb3IsIF9Qcm9zZU1pcnJvckVycm9yKTtcblxuICBmdW5jdGlvbiBTY2hlbWFFcnJvcigpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU2NoZW1hRXJyb3IpO1xuXG4gICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoU2NoZW1hRXJyb3IucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgcmV0dXJuIFNjaGVtYUVycm9yO1xufSkoX3V0aWxFcnJvci5Qcm9zZU1pcnJvckVycm9yKTtcblxuZXhwb3J0cy5TY2hlbWFFcnJvciA9IFNjaGVtYUVycm9yO1xuXG5mdW5jdGlvbiBmaW5kS2luZHModHlwZSwgbmFtZSwgc2NoZW1hLCBvdmVycmlkZSkge1xuICBmdW5jdGlvbiBzZXQoc3ViLCBzdXApIHtcbiAgICBpZiAoc3ViIGluIHNjaGVtYS5raW5kcykge1xuICAgICAgaWYgKHNjaGVtYS5raW5kc1tzdWJdID09IHN1cCkgcmV0dXJuO1xuICAgICAgU2NoZW1hRXJyb3IucmFpc2UoXCJJbmNvbnNpc3RlbnQgc3VwZXJraW5kcyBmb3Iga2luZCBcIiArIHN1YiArIFwiOiBcIiArIHN1cCArIFwiIGFuZCBcIiArIHNjaGVtYS5raW5kc1tzdWJdKTtcbiAgICB9XG4gICAgaWYgKHNjaGVtYS5zdWJLaW5kKHN1Yiwgc3VwKSkgU2NoZW1hRXJyb3IucmFpc2UoXCJDb25mbGljdGluZyBraW5kIGhpZXJhcmNoeSB0aHJvdWdoIFwiICsgc3ViICsgXCIgYW5kIFwiICsgc3VwKTtcbiAgICBzY2hlbWEua2luZHNbc3ViXSA9IHN1cDtcbiAgfVxuXG4gIGZvciAodmFyIGN1ciA9IHR5cGU7OyBjdXIgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY3VyKSkge1xuICAgIHZhciBjdXJLaW5kID0gb3ZlcnJpZGUgIT0gbnVsbCAmJiBjdXIgPT0gdHlwZSA/IG92ZXJyaWRlIDogY3VyLmtpbmQ7XG4gICAgaWYgKGN1cktpbmQgIT0gbnVsbCkge1xuICAgICAgdmFyIF8kJGV4ZWMgPSAvXiguKj8pKFxcLik/JC8uZXhlYyhjdXJLaW5kKTtcblxuICAgICAgdmFyIF8kJGV4ZWMyID0gX3NsaWNlZFRvQXJyYXkoXyQkZXhlYywgMyk7XG5cbiAgICAgIHZhciBfID0gXyQkZXhlYzJbMF07XG4gICAgICB2YXIga2luZCA9IF8kJGV4ZWMyWzFdO1xuICAgICAgdmFyIGVuZCA9IF8kJGV4ZWMyWzJdO1xuXG4gICAgICBpZiAoa2luZCkge1xuICAgICAgICBzZXQobmFtZSwga2luZCk7XG4gICAgICAgIG5hbWUgPSBraW5kO1xuICAgICAgfVxuICAgICAgaWYgKGVuZCkge1xuICAgICAgICBzZXQobmFtZSwgbnVsbCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLy8gOzsgTm9kZSB0eXBlcyBhcmUgb2JqZWN0cyBhbGxvY2F0ZWQgb25jZSBwZXIgYFNjaGVtYWBcbi8vIGFuZCB1c2VkIHRvIHRhZyBgTm9kZWAgaW5zdGFuY2VzIHdpdGggYSB0eXBlLiBUaGV5IGFyZVxuLy8gaW5zdGFuY2VzIG9mIHN1Yi10eXBlcyBvZiB0aGlzIGNsYXNzLCBhbmQgY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dFxuLy8gdGhlIG5vZGUgdHlwZSAoaXRzIG5hbWUsIGl0cyBhbGxvd2VkIGF0dHJpYnV0ZXMsIG1ldGhvZHMgZm9yXG4vLyBzZXJpYWxpemluZyBpdCB0byB2YXJpb3VzIGZvcm1hdHMsIGluZm9ybWF0aW9uIHRvIGd1aWRlXG4vLyBkZXNlcmlhbGl6YXRpb24sIGFuZCBzbyBvbikuXG5cbnZhciBOb2RlVHlwZSA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE5vZGVUeXBlKG5hbWUsIGNvbnRhaW5zLCBhdHRycywgc2NoZW1hKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE5vZGVUeXBlKTtcblxuICAgIC8vIDo6IHN0cmluZ1xuICAgIC8vIFRoZSBuYW1lIHRoZSBub2RlIHR5cGUgaGFzIGluIHRoaXMgc2NoZW1hLlxuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgLy8gOjogP3N0cmluZ1xuICAgIC8vIFRoZSBraW5kIG9mIG5vZGVzIHRoaXMgbm9kZSBtYXkgY29udGFpbi4gYG51bGxgIG1lYW5zIGl0J3MgYVxuICAgIC8vIGxlYWYgbm9kZS5cbiAgICB0aGlzLmNvbnRhaW5zID0gY29udGFpbnM7XG4gICAgLy8gOjogT2JqZWN0PEF0dHJpYnV0ZT5cbiAgICAvLyBUaGUgYXR0cmlidXRlcyBhbGxvd2VkIG9uIHRoaXMgbm9kZSB0eXBlLlxuICAgIHRoaXMuYXR0cnMgPSBhdHRycztcbiAgICAvLyA6OiBTY2hlbWFcbiAgICAvLyBBIGxpbmsgYmFjayB0byB0aGUgYFNjaGVtYWAgdGhlIG5vZGUgdHlwZSBiZWxvbmdzIHRvLlxuICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgIHRoaXMuZGVmYXVsdEF0dHJzID0gZ2V0RGVmYXVsdEF0dHJzKGF0dHJzKTtcbiAgfVxuXG4gIC8vIDo6IE9iamVjdDxBdHRyaWJ1dGU+XG4gIC8vIFRoZSBkZWZhdWx0IHNldCBvZiBhdHRyaWJ1dGVzIHRvIGFzc29jaWF0ZSB3aXRoIGEgZ2l2ZW4gdHlwZS4gTm90ZVxuICAvLyB0aGF0IHNjaGVtYXMgbWF5IGFkZCBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgdG8gaW5zdGFuY2VzIG9mIHRoZVxuICAvLyB0eXBlLlxuXG4gIC8vIDo6IGJvb2xcbiAgLy8gVHJ1ZSBpZiB0aGlzIGlzIGEgYmxvY2sgdHlwZS5cblxuICBfY3JlYXRlQ2xhc3MoTm9kZVR5cGUsIFt7XG4gICAga2V5OiBcImNhbkNvbnRhaW5GcmFnbWVudFwiLFxuXG4gICAgLy8gOjogKEZyYWdtZW50KSDihpIgYm9vbFxuICAgIC8vIFRlc3Qgd2hldGhlciB0aGUgY29udGVudCBvZiB0aGUgZ2l2ZW4gZnJhZ21lbnQgY291bGQgYmUgY29udGFpbmVkXG4gICAgLy8gaW4gdGhpcyBub2RlIHR5cGUuXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNhbkNvbnRhaW5GcmFnbWVudChmcmFnbWVudCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIG9rID0gdHJ1ZTtcbiAgICAgIGZyYWdtZW50LmZvckVhY2goZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgaWYgKCFfdGhpcy5jYW5Db250YWluKG4pKSBvayA9IGZhbHNlO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gb2s7XG4gICAgfVxuXG4gICAgLy8gOjogKE5vZGUpIOKGkiBib29sXG4gICAgLy8gVGVzdCB3aGV0aGVyIHRoZSBnaXZlbiBub2RlIGNvdWxkIGJlIGNvbnRhaW5lZCBpbiB0aGlzIG5vZGUgdHlwZS5cbiAgfSwge1xuICAgIGtleTogXCJjYW5Db250YWluXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNhbkNvbnRhaW4obm9kZSkge1xuICAgICAgaWYgKCF0aGlzLmNhbkNvbnRhaW5UeXBlKG5vZGUudHlwZSkpIHJldHVybiBmYWxzZTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5tYXJrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoIXRoaXMuY2FuQ29udGFpbk1hcmsobm9kZS5tYXJrc1tpXSkpIHJldHVybiBmYWxzZTtcbiAgICAgIH1yZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyA6OiAoTWFyaykg4oaSIGJvb2xcbiAgICAvLyBUZXN0IHdoZXRoZXIgdGhpcyBub2RlIHR5cGUgY2FuIGNvbnRhaW4gY2hpbGRyZW4gd2l0aCB0aGUgZ2l2ZW5cbiAgICAvLyBtYXJrLlxuICB9LCB7XG4gICAga2V5OiBcImNhbkNvbnRhaW5NYXJrXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNhbkNvbnRhaW5NYXJrKG1hcmspIHtcbiAgICAgIHZhciBjb250YWlucyA9IHRoaXMuY29udGFpbnNNYXJrcztcbiAgICAgIGlmIChjb250YWlucyA9PT0gdHJ1ZSkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoY29udGFpbnMpIGZvciAodmFyIGkgPSAwOyBpIDwgY29udGFpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGNvbnRhaW5zW2ldID09IG1hcmsubmFtZSkgcmV0dXJuIHRydWU7XG4gICAgICB9cmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIDo6IChOb2RlVHlwZSkg4oaSIGJvb2xcbiAgICAvLyBUZXN0IHdoZXRoZXIgdGhpcyBub2RlIHR5cGUgY2FuIGNvbnRhaW4gbm9kZXMgb2YgdGhlIGdpdmVuIG5vZGVcbiAgICAvLyB0eXBlLlxuICB9LCB7XG4gICAga2V5OiBcImNhbkNvbnRhaW5UeXBlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNhbkNvbnRhaW5UeXBlKHR5cGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYS5zdWJLaW5kKHR5cGUubmFtZSwgdGhpcy5jb250YWlucyk7XG4gICAgfVxuXG4gICAgLy8gOjogKE5vZGVUeXBlKSDihpIgYm9vbFxuICAgIC8vIFRlc3Qgd2hldGhlciB0aGUgbm9kZXMgdGhhdCBjYW4gYmUgY29udGFpbmVkIGluIHRoZSBnaXZlbiBub2RlXG4gICAgLy8gdHlwZSBhcmUgYSBzdWItdHlwZSBvZiB0aGUgbm9kZXMgdGhhdCBjYW4gYmUgY29udGFpbmVkIGluIHRoaXNcbiAgICAvLyB0eXBlLlxuICB9LCB7XG4gICAga2V5OiBcImNhbkNvbnRhaW5Db250ZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNhbkNvbnRhaW5Db250ZW50KHR5cGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYS5zdWJLaW5kKHR5cGUuY29udGFpbnMsIHRoaXMuY29udGFpbnMpO1xuICAgIH1cblxuICAgIC8vIDo6IChOb2RlVHlwZSkg4oaSIFtOb2RlVHlwZV1cbiAgICAvLyBGaW5kIGEgc2V0IG9mIGludGVybWVkaWF0ZSBub2RlIHR5cGVzLCBwb3NzaWJseSBlbXB0eSwgdGhhdCBoYXZlXG4gICAgLy8gdG8gYmUgaW5zZXJ0ZWQgYmV0d2VlbiB0aGlzIHR5cGUgYW5kIGBvdGhlcmAgdG8gcHV0IGEgbm9kZSBvZlxuICAgIC8vIHR5cGUgYG90aGVyYCBpbnRvIHRoaXMgdHlwZS5cbiAgfSwge1xuICAgIGtleTogXCJmaW5kQ29ubmVjdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmaW5kQ29ubmVjdGlvbihvdGhlcikge1xuICAgICAgLy8gRklYTUUgc29tZWhvdyBkZWZpbmUgYW4gb3JkZXIgaW4gd2hpY2ggdGhlc2UgYXJlIHRyaWVkXG4gICAgICBpZiAodGhpcy5jYW5Db250YWluVHlwZShvdGhlcikpIHJldHVybiBbXTtcblxuICAgICAgdmFyIHNlZW4gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgdmFyIGFjdGl2ZSA9IFt7IGZyb206IHRoaXMsIHZpYTogW10gfV07XG4gICAgICB3aGlsZSAoYWN0aXZlLmxlbmd0aCkge1xuICAgICAgICB2YXIgY3VycmVudCA9IGFjdGl2ZS5zaGlmdCgpO1xuICAgICAgICBmb3IgKHZhciBfbmFtZSBpbiB0aGlzLnNjaGVtYS5ub2Rlcykge1xuICAgICAgICAgIHZhciB0eXBlID0gdGhpcy5zY2hlbWEubm9kZXNbX25hbWVdO1xuICAgICAgICAgIGlmICh0eXBlLmRlZmF1bHRBdHRycyAmJiAhKHR5cGUuY29udGFpbnMgaW4gc2VlbikgJiYgY3VycmVudC5mcm9tLmNhbkNvbnRhaW5UeXBlKHR5cGUpKSB7XG4gICAgICAgICAgICB2YXIgdmlhID0gY3VycmVudC52aWEuY29uY2F0KHR5cGUpO1xuICAgICAgICAgICAgaWYgKHR5cGUuY2FuQ29udGFpblR5cGUob3RoZXIpKSByZXR1cm4gdmlhO1xuICAgICAgICAgICAgYWN0aXZlLnB1c2goeyBmcm9tOiB0eXBlLCB2aWE6IHZpYSB9KTtcbiAgICAgICAgICAgIHNlZW5bdHlwZS5jb250YWluc10gPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJidWlsZEF0dHJzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkQXR0cnMoYXR0cnMsIGNvbnRlbnQpIHtcbiAgICAgIGlmICghYXR0cnMgJiYgdGhpcy5kZWZhdWx0QXR0cnMpIHJldHVybiB0aGlzLmRlZmF1bHRBdHRycztlbHNlIHJldHVybiBfYnVpbGRBdHRycyh0aGlzLmF0dHJzLCBhdHRycywgdGhpcywgY29udGVudCk7XG4gICAgfVxuXG4gICAgLy8gOjogKD9PYmplY3QsID9GcmFnbWVudCwgP1tNYXJrXSkg4oaSIE5vZGVcbiAgICAvLyBDcmVhdGUgYSBgTm9kZWAgb2YgdGhpcyB0eXBlLiBUaGUgZ2l2ZW4gYXR0cmlidXRlcyBhcmVcbiAgICAvLyBjaGVja2VkIGFuZCBkZWZhdWx0ZWQgKHlvdSBjYW4gcGFzcyBgbnVsbGAgdG8gdXNlIHRoZSB0eXBlJ3NcbiAgICAvLyBkZWZhdWx0cyBlbnRpcmVseSwgaWYgbm8gcmVxdWlyZWQgYXR0cmlidXRlcyBleGlzdCkuIGBjb250ZW50YFxuICAgIC8vIG1heSBiZSBhIGBGcmFnbWVudGAsIGEgbm9kZSwgYW4gYXJyYXkgb2Ygbm9kZXMsIG9yXG4gICAgLy8gYG51bGxgLiBTaW1pbGFybHkgYG1hcmtzYCBtYXkgYmUgYG51bGxgIHRvIGRlZmF1bHQgdG8gdGhlIGVtcHR5XG4gICAgLy8gc2V0IG9mIG1hcmtzLlxuICB9LCB7XG4gICAga2V5OiBcImNyZWF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGUoYXR0cnMsIGNvbnRlbnQsIG1hcmtzKSB7XG4gICAgICByZXR1cm4gbmV3IF9ub2RlLk5vZGUodGhpcywgdGhpcy5idWlsZEF0dHJzKGF0dHJzLCBjb250ZW50KSwgX2ZyYWdtZW50LkZyYWdtZW50LmZyb20oY29udGVudCksIF9tYXJrLk1hcmsuc2V0RnJvbShtYXJrcykpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjcmVhdGVBdXRvRmlsbFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVBdXRvRmlsbChhdHRycywgY29udGVudCwgbWFya3MpIHtcbiAgICAgIGlmICgoIWNvbnRlbnQgfHwgY29udGVudC5sZW5ndGggPT0gMCkgJiYgIXRoaXMuY2FuQmVFbXB0eSkgY29udGVudCA9IHRoaXMuZGVmYXVsdENvbnRlbnQoKTtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZShhdHRycywgY29udGVudCwgbWFya3MpO1xuICAgIH1cblxuICAgIC8vIDo6IGJvb2xcbiAgICAvLyBDb250cm9scyB3aGV0aGVyIHRoaXMgbm9kZSBpcyBhbGxvd2VkIHRvIGJlIGVtcHR5LlxuICB9LCB7XG4gICAga2V5OiBcImlzQmxvY2tcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyA6OiBib29sXG4gICAgLy8gVHJ1ZSBpZiB0aGlzIGlzIGEgdGV4dGJsb2NrIHR5cGUsIGEgYmxvY2sgdGhhdCBjb250YWlucyBpbmxpbmVcbiAgICAvLyBjb250ZW50LlxuICB9LCB7XG4gICAga2V5OiBcImlzVGV4dGJsb2NrXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gOjogYm9vbFxuICAgIC8vIFRydWUgaWYgdGhpcyBpcyBhbiBpbmxpbmUgdHlwZS5cbiAgfSwge1xuICAgIGtleTogXCJpc0lubGluZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIDo6IGJvb2xcbiAgICAvLyBUcnVlIGlmIHRoaXMgaXMgdGhlIHRleHQgbm9kZSB0eXBlLlxuICB9LCB7XG4gICAga2V5OiBcImlzVGV4dFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIDo6IGJvb2xcbiAgICAvLyBDb250cm9scyB3aGV0aGVyIG5vZGVzIG9mIHRoaXMgdHlwZSBjYW4gYmUgc2VsZWN0ZWQgKGFzIGEgdXNlclxuICAgIC8vIG5vZGUgc2VsZWN0aW9uKS5cbiAgfSwge1xuICAgIGtleTogXCJzZWxlY3RhYmxlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyA6OiBib29sXG4gICAgLy8gQ29udHJvbHMgd2hldGhlciB0aGlzIG5vZGUgdHlwZSBpcyBsb2NrZWQuXG4gIH0sIHtcbiAgICBrZXk6IFwibG9ja2VkXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gOjogc3RyaW5nXG4gICAgLy8gQ29udHJvbHMgdGhlIF9raW5kXyBvZiB0aGUgbm9kZSwgd2hpY2ggaXMgdXNlZCB0byBkZXRlcm1pbmUgdmFsaWRcbiAgICAvLyBwYXJlbnQvY2hpbGQgcmVsYXRpb25zLiBDYW4gYmUgYSB3b3JkLCB3aGljaCBhZGRzIHRoYXQga2luZCB0b1xuICAgIC8vIHRoZSBzZXQgb2Yga2luZHMgb2YgdGhlIHN1cGVyY2xhc3MsIGEgd29yZCBmb2xsb3dlZCBieSBhIGRvdCwgdG9cbiAgICAvLyBpZ25vcmUgdGhlIGtpbmRzIG9mIHRoZSBzdXBlcmNsYXNzIGFuZCB1c2Ugb25seSB0aGF0IHdvcmQgKGFsb25nXG4gICAgLy8gd2l0aCB0aGUgbm9kZSdzIG5hbWUpIGFzIGtpbmQsIG9yIG9ubHkgYSBkb3QsIGluIHdoaWNoIGNhc2UgdGhlXG4gICAgLy8gb25seSBraW5kIHRoZSBub2RlIGhhcyBpcyBpdHMgb3duIG5hbWUuXG4gIH0sIHtcbiAgICBrZXk6IFwiY2FuQmVFbXB0eVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbnRhaW5zTWFya3NcIixcblxuICAgIC8vIDo6IHVuaW9uPGJvb2wsIFtzdHJpbmddPlxuICAgIC8vIFRoZSBtYXJrIHR5cGVzIHRoYXQgY2hpbGQgbm9kZXMgb2YgdGhpcyBub2RlIG1heSBoYXZlLiBgZmFsc2VgXG4gICAgLy8gbWVhbnMgbm8gbWFya3MsIGB0cnVlYCBtZWFucyBhbnkgbWFyaywgYW5kIGFuIGFycmF5IG9mIHN0cmluZ3NcbiAgICAvLyBjYW4gYmUgdXNlZCB0byBleHBsaWNpdGx5IGxpc3QgdGhlIGFsbG93ZWQgbWFyayB0eXBlcy5cbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogXCJjb21waWxlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBpbGUodHlwZXMsIHNjaGVtYSkge1xuICAgICAgdmFyIHJlc3VsdCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICBmb3IgKHZhciBfbmFtZTIgaW4gdHlwZXMpIHtcbiAgICAgICAgdmFyIGluZm8gPSB0eXBlc1tfbmFtZTJdO1xuICAgICAgICB2YXIgdHlwZSA9IGluZm8udHlwZSB8fCBTY2hlbWFFcnJvci5yYWlzZShcIk1pc3Npbmcgbm9kZSB0eXBlIGZvciBcIiArIF9uYW1lMik7XG4gICAgICAgIGZpbmRLaW5kcyh0eXBlLCBfbmFtZTIsIHNjaGVtYSwgaW5mby5raW5kKTtcbiAgICAgICAgdmFyIGNvbnRhaW5zID0gXCJjb250YWluc1wiIGluIGluZm8gPyBpbmZvLmNvbnRhaW5zIDogdHlwZS5jb250YWlucztcbiAgICAgICAgdmFyIGF0dHJzID0gdHlwZS5hdHRyaWJ1dGVzO1xuICAgICAgICBpZiAoaW5mby5hdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgYXR0cnMgPSBjb3B5T2JqKGF0dHJzKTtcbiAgICAgICAgICBmb3IgKHZhciBhTmFtZSBpbiBpbmZvLmF0dHJpYnV0ZXMpIGF0dHJzW2FOYW1lXSA9IGluZm8uYXR0cmlidXRlc1thTmFtZV07XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0W19uYW1lMl0gPSBuZXcgdHlwZShfbmFtZTIsIGNvbnRhaW5zLCBhdHRycywgc2NoZW1hKTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIF9uYW1lMyBpbiByZXN1bHQpIHtcbiAgICAgICAgdmFyIGNvbnRhaW5zID0gcmVzdWx0W19uYW1lM10uY29udGFpbnM7XG4gICAgICAgIGlmIChjb250YWlucyAmJiAhKGNvbnRhaW5zIGluIHNjaGVtYS5raW5kcykpIFNjaGVtYUVycm9yLnJhaXNlKFwiTm9kZSB0eXBlIFwiICsgX25hbWUzICsgXCIgaXMgc3BlY2lmaWVkIHRvIGNvbnRhaW4gbm9uLWV4aXN0aW5nIGtpbmQgXCIgKyBjb250YWlucyk7XG4gICAgICB9XG4gICAgICBpZiAoIXJlc3VsdC5kb2MpIFNjaGVtYUVycm9yLnJhaXNlKFwiRXZlcnkgc2NoZW1hIG5lZWRzIGEgJ2RvYycgdHlwZVwiKTtcbiAgICAgIGlmICghcmVzdWx0LnRleHQpIFNjaGVtYUVycm9yLnJhaXNlKFwiRXZlcnkgc2NoZW1hIG5lZWRzIGEgJ3RleHQnIHR5cGVcIik7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8gOjogKHN0cmluZywgKilcbiAgICAvLyBSZWdpc3RlciBhbiBlbGVtZW50IGluIHRoaXMgdHlwZSdzIHJlZ2lzdHJ5LiBUaGF0IGlzLCBhZGQgYHZhbHVlYFxuICAgIC8vIHRvIHRoZSBhcnJheSBhc3NvY2lhdGVkIHdpdGggYG5hbWVgIGluIHRoZSByZWdpc3RyeSBzdG9yZWQgaW5cbiAgICAvLyB0eXBlJ3MgYHByb3RvdHlwZWAuIFRoaXMgaXMgbW9zdGx5IHVzZWQgdG8gYXR0YWNoIHRoaW5ncyBsaWtlXG4gICAgLy8gY29tbWFuZHMgYW5kIHBhcnNpbmcgc3RyYXRlZ2llcyB0byBub2RlIHR5cGVzLiBTZWUgYFNjaGVtYS5yZWdpc3RyeWAuXG4gIH0sIHtcbiAgICBrZXk6IFwicmVnaXN0ZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVnaXN0ZXIobmFtZSwgdmFsdWUpIHtcbiAgICAgIHZhciByZWdpc3RyeSA9IHRoaXMucHJvdG90eXBlLmhhc093blByb3BlcnR5KFwicmVnaXN0cnlcIikgPyB0aGlzLnByb3RvdHlwZS5yZWdpc3RyeSA6IHRoaXMucHJvdG90eXBlLnJlZ2lzdHJ5ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsocmVnaXN0cnlbbmFtZV0gfHwgKHJlZ2lzdHJ5W25hbWVdID0gW10pKS5wdXNoKHZhbHVlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwia2luZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIFwiLlwiO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBOb2RlVHlwZTtcbn0pKCk7XG5cbmV4cG9ydHMuTm9kZVR5cGUgPSBOb2RlVHlwZTtcbk5vZGVUeXBlLmF0dHJpYnV0ZXMgPSB7fTtcblxuLy8gOzsgI3RvYz1mYWxzZSBCYXNlIHR5cGUgZm9yIGJsb2NrIG5vZGV0eXBlcy5cblxudmFyIEJsb2NrID0gKGZ1bmN0aW9uIChfTm9kZVR5cGUpIHtcbiAgX2luaGVyaXRzKEJsb2NrLCBfTm9kZVR5cGUpO1xuXG4gIGZ1bmN0aW9uIEJsb2NrKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBCbG9jayk7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihCbG9jay5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICAvLyA7OyAjdG9jPWZhbHNlIEJhc2UgdHlwZSBmb3IgdGV4dGJsb2NrIG5vZGUgdHlwZXMuXG5cbiAgX2NyZWF0ZUNsYXNzKEJsb2NrLCBbe1xuICAgIGtleTogXCJkZWZhdWx0Q29udGVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZWZhdWx0Q29udGVudCgpIHtcbiAgICAgIHZhciBpbm5lciA9IHRoaXMuc2NoZW1hLmRlZmF1bHRUZXh0YmxvY2tUeXBlKCkuY3JlYXRlKCk7XG4gICAgICB2YXIgY29ubiA9IHRoaXMuZmluZENvbm5lY3Rpb24oaW5uZXIudHlwZSk7XG4gICAgICBpZiAoIWNvbm4pIFNjaGVtYUVycm9yLnJhaXNlKFwiQ2FuJ3QgY3JlYXRlIGRlZmF1bHQgY29udGVudCBmb3IgXCIgKyB0aGlzLm5hbWUpO1xuICAgICAgZm9yICh2YXIgaSA9IGNvbm4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgaW5uZXIgPSBjb25uW2ldLmNyZWF0ZShudWxsLCBpbm5lcik7XG4gICAgICB9cmV0dXJuIF9mcmFnbWVudC5GcmFnbWVudC5mcm9tKGlubmVyKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNCbG9ja1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNhbkJlRW1wdHlcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5zID09IG51bGw7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwiY29udGFpbnNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBcImJsb2NrXCI7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImtpbmRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBcImJsb2NrLlwiO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBCbG9jaztcbn0pKE5vZGVUeXBlKTtcblxuZXhwb3J0cy5CbG9jayA9IEJsb2NrO1xuXG52YXIgVGV4dGJsb2NrID0gKGZ1bmN0aW9uIChfQmxvY2spIHtcbiAgX2luaGVyaXRzKFRleHRibG9jaywgX0Jsb2NrKTtcblxuICBmdW5jdGlvbiBUZXh0YmxvY2soKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRleHRibG9jayk7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihUZXh0YmxvY2sucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgLy8gOzsgI3RvYz1mYWxzZSBCYXNlIHR5cGUgZm9yIGlubGluZSBub2RlIHR5cGVzLlxuXG4gIF9jcmVhdGVDbGFzcyhUZXh0YmxvY2ssIFt7XG4gICAga2V5OiBcImNvbnRhaW5zTWFya3NcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc1RleHRibG9ja1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNhbkJlRW1wdHlcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiBcImNvbnRhaW5zXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gXCJpbmxpbmVcIjtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gVGV4dGJsb2NrO1xufSkoQmxvY2spO1xuXG5leHBvcnRzLlRleHRibG9jayA9IFRleHRibG9jaztcblxudmFyIElubGluZSA9IChmdW5jdGlvbiAoX05vZGVUeXBlMikge1xuICBfaW5oZXJpdHMoSW5saW5lLCBfTm9kZVR5cGUyKTtcblxuICBmdW5jdGlvbiBJbmxpbmUoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIElubGluZSk7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihJbmxpbmUucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgLy8gOzsgI3RvYz1mYWxzZSBUaGUgdGV4dCBub2RlIHR5cGUuXG5cbiAgX2NyZWF0ZUNsYXNzKElubGluZSwgW3tcbiAgICBrZXk6IFwiaXNJbmxpbmVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiBcImNvbnRhaW5zXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwia2luZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIFwiaW5saW5lLlwiO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBJbmxpbmU7XG59KShOb2RlVHlwZSk7XG5cbmV4cG9ydHMuSW5saW5lID0gSW5saW5lO1xuXG52YXIgVGV4dCA9IChmdW5jdGlvbiAoX0lubGluZSkge1xuICBfaW5oZXJpdHMoVGV4dCwgX0lubGluZSk7XG5cbiAgZnVuY3Rpb24gVGV4dCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVGV4dCk7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihUZXh0LnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIC8vIEF0dHJpYnV0ZSBkZXNjcmlwdG9yc1xuXG4gIC8vIDs7IEF0dHJpYnV0ZXMgYXJlIG5hbWVkIHN0cmluZ3MgYXNzb2NpYXRlZCB3aXRoIG5vZGVzIGFuZCBtYXJrcy5cbiAgLy8gRWFjaCBub2RlIHR5cGUgb3IgbWFyayB0eXBlIGhhcyBhIGZpeGVkIHNldCBvZiBhdHRyaWJ1dGVzLCB3aGljaFxuICAvLyBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBhcmUgdXNlZCB0byBjb250cm9sLlxuXG4gIF9jcmVhdGVDbGFzcyhUZXh0LCBbe1xuICAgIGtleTogXCJjcmVhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY3JlYXRlKGF0dHJzLCBjb250ZW50LCBtYXJrcykge1xuICAgICAgcmV0dXJuIG5ldyBfbm9kZS5UZXh0Tm9kZSh0aGlzLCB0aGlzLmJ1aWxkQXR0cnMoYXR0cnMsIGNvbnRlbnQpLCBjb250ZW50LCBtYXJrcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNlbGVjdGFibGVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNUZXh0XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gVGV4dDtcbn0pKElubGluZSk7XG5cbmV4cG9ydHMuVGV4dCA9IFRleHQ7XG5cbnZhciBBdHRyaWJ1dGUgPSAoZnVuY3Rpb24gKCkge1xuICAvLyA6OiAoT2JqZWN0KVxuICAvLyBDcmVhdGUgYW4gYXR0cmlidXRlLiBgb3B0aW9uc2AgaXMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlXG4gIC8vIHNldHRpbmdzIGZvciB0aGUgYXR0cmlidXRlcy4gVGhlIGZvbGxvd2luZyBzZXR0aW5ncyBhcmVcbiAgLy8gc3VwcG9ydGVkOlxuICAvL1xuICAvLyAqKmBkZWZhdWx0YCoqOiBgP3N0cmluZ2BcbiAgLy8gOiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBhdHRyaWJ1dGUsIHRvIGNob29zZSB3aGVuIG5vXG4gIC8vICAgZXhwbGljaXQgdmFsdWUgaXMgcHJvdmlkZWQuXG4gIC8vXG4gIC8vICoqYGNvbXB1dGVgKio6IGA/KEZyYWdtZW50KSDihpIgc3RyaW5nYFxuICAvLyA6IEEgZnVuY3Rpb24gdGhhdCBjb21wdXRlcyBhIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUgZnJvbVxuICAvLyAgIHRoZSBub2RlJ3MgY29udGVudC5cbiAgLy9cbiAgLy8gQXR0cmlidXRlcyB0aGF0IGhhdmUgbm8gZGVmYXVsdCBvciBjb21wdXRlIHByb3BlcnR5IG11c3QgYmVcbiAgLy8gcHJvdmlkZWQgd2hlbmV2ZXIgYSBub2RlIG9yIG1hcmsgb2YgYSB0eXBlIHRoYXQgaGFzIHRoZW0gaXNcbiAgLy8gY3JlYXRlZC5cblxuICBmdW5jdGlvbiBBdHRyaWJ1dGUoKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1swXTtcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBBdHRyaWJ1dGUpO1xuXG4gICAgdGhpc1tcImRlZmF1bHRcIl0gPSBvcHRpb25zW1wiZGVmYXVsdFwiXTtcbiAgICB0aGlzLmNvbXB1dGUgPSBvcHRpb25zLmNvbXB1dGU7XG4gICAgdGhpcy5yZWdpc3RyeSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIH1cblxuICAvLyBNYXJrc1xuXG4gIC8vIDs7IExpa2Ugbm9kZXMsIG1hcmtzICh3aGljaCBhcmUgYXNzb2NpYXRlZCB3aXRoIG5vZGVzIHRvIHNpZ25pZnlcbiAgLy8gdGhpbmdzIGxpa2UgZW1waGFzaXMgb3IgYmVpbmcgcGFydCBvZiBhIGxpbmspIGFyZSB0YWdnZWQgd2l0aCB0eXBlXG4gIC8vIG9iamVjdHMsIHdoaWNoIGFyZSBpbnN0YW50aWF0ZWQgb25jZSBwZXIgYFNjaGVtYWAuXG5cbiAgLy8gOjogKHN0cmluZywgKilcbiAgLy8gUmVnaXN0ZXIgYSB2YWx1ZSBpbiB0aGlzIGF0dHJpYnV0ZSdzIHJlZ2lzdHJ5LiBTZWVcbiAgLy8gYE5vZGVUeXBlLnJlZ2lzdGVyYCBhbmQgYFNjaGVtYS5yZWdpc3RyeWAuXG5cbiAgX2NyZWF0ZUNsYXNzKEF0dHJpYnV0ZSwgW3tcbiAgICBrZXk6IFwicmVnaXN0ZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVnaXN0ZXIobmFtZSwgdmFsdWUpIHtcbiAgICAgIDsodGhpcy5yZWdpc3RyeVtuYW1lXSB8fCAodGhpcy5yZWdpc3RyeVtuYW1lXSA9IFtdKSkucHVzaCh2YWx1ZSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEF0dHJpYnV0ZTtcbn0pKCk7XG5cbmV4cG9ydHMuQXR0cmlidXRlID0gQXR0cmlidXRlO1xuXG52YXIgTWFya1R5cGUgPSAoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBNYXJrVHlwZShuYW1lLCBhdHRycywgcmFuaywgc2NoZW1hKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE1hcmtUeXBlKTtcblxuICAgIC8vIDo6IHN0cmluZ1xuICAgIC8vIFRoZSBuYW1lIG9mIHRoZSBtYXJrIHR5cGUuXG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAvLyA6OiBPYmplY3Q8QXR0cmlidXRlPlxuICAgIC8vIFRoZSBhdHRyaWJ1dGVzIHN1cHBvcnRlZCBieSB0aGlzIHR5cGUgb2YgbWFyay5cbiAgICB0aGlzLmF0dHJzID0gYXR0cnM7XG4gICAgdGhpcy5yYW5rID0gcmFuaztcbiAgICAvLyA6OiBTY2hlbWFcbiAgICAvLyBUaGUgc2NoZW1hIHRoYXQgdGhpcyBtYXJrIHR5cGUgaW5zdGFuY2UgaXMgcGFydCBvZi5cbiAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcbiAgICB2YXIgZGVmYXVsdHMgPSBnZXREZWZhdWx0QXR0cnModGhpcy5hdHRycyk7XG4gICAgdGhpcy5pbnN0YW5jZSA9IGRlZmF1bHRzICYmIG5ldyBfbWFyay5NYXJrKHRoaXMsIGRlZmF1bHRzKTtcbiAgfVxuXG4gIC8vIDo6IE9iamVjdDxBdHRyaWJ1dGU+XG4gIC8vIFRoZSBkZWZhdWx0IHNldCBvZiBhdHRyaWJ1dGVzIHRvIGFzc29jaWF0ZSB3aXRoIGEgbWFyayB0eXBlLiBCeVxuICAvLyBkZWZhdWx0LCB0aGlzIHJldHVybnMgYW4gZW1wdHkgb2JqZWN0LlxuXG4gIC8vIDo6IG51bWJlclxuICAvLyBNYXJrIHR5cGUgcmFua3MgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBvcmRlciBpbiB3aGljaCBtYXJrXG4gIC8vIGFycmF5cyBhcmUgc29ydGVkLiAoSWYgbXVsdGlwbGUgbWFyayB0eXBlcyBlbmQgdXAgd2l0aCB0aGUgc2FtZVxuICAvLyByYW5rLCB0aGV5IHN0aWxsIGdldCBhIGZpeGVkIG9yZGVyIGluIHRoZSBzY2hlbWEsIGJ1dCB0aGVyZSdzIG5vXG4gIC8vIGd1YXJhbnRlZSB3aGF0IGl0IHdpbGwgYmUuKVxuXG4gIF9jcmVhdGVDbGFzcyhNYXJrVHlwZSwgW3tcbiAgICBrZXk6IFwiY3JlYXRlXCIsXG5cbiAgICAvLyA6OiAoT2JqZWN0KSDihpIgTWFya1xuICAgIC8vIENyZWF0ZSBhIG1hcmsgb2YgdGhpcyB0eXBlLiBgYXR0cnNgIG1heSBiZSBgbnVsbGAgb3IgYW4gb2JqZWN0XG4gICAgLy8gY29udGFpbmluZyBvbmx5IHNvbWUgb2YgdGhlIG1hcmsncyBhdHRyaWJ1dGVzLiBUaGUgb3RoZXJzLCBpZlxuICAgIC8vIHRoZXkgaGF2ZSBkZWZhdWx0cywgd2lsbCBiZSBhZGRlZC5cbiAgICB2YWx1ZTogZnVuY3Rpb24gY3JlYXRlKGF0dHJzKSB7XG4gICAgICBpZiAoIWF0dHJzICYmIHRoaXMuaW5zdGFuY2UpIHJldHVybiB0aGlzLmluc3RhbmNlO1xuICAgICAgcmV0dXJuIG5ldyBfbWFyay5NYXJrKHRoaXMsIF9idWlsZEF0dHJzKHRoaXMuYXR0cnMsIGF0dHJzLCB0aGlzKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbW92ZUZyb21TZXRcIixcblxuICAgIC8vIDo6IChbTWFya10pIOKGkiBbTWFya11cbiAgICAvLyBXaGVuIHRoZXJlIGlzIGEgbWFyayBvZiB0aGlzIHR5cGUgaW4gdGhlIGdpdmVuIHNldCwgYSBuZXcgc2V0XG4gICAgLy8gd2l0aG91dCBpdCBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlLCB0aGUgaW5wdXQgc2V0IGlzIHJldHVybmVkLlxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVGcm9tU2V0KHNldCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKyspIGlmIChzZXRbaV0udHlwZSA9PSB0aGlzKSByZXR1cm4gc2V0LnNsaWNlKDAsIGkpLmNvbmNhdChzZXQuc2xpY2UoaSArIDEpKTtcbiAgICAgIHJldHVybiBzZXQ7XG4gICAgfVxuXG4gICAgLy8gOjogKFtNYXJrXSkg4oaSIGJvb2xcbiAgICAvLyBUZXN0cyB3aGV0aGVyIHRoZXJlIGlzIGEgbWFyayBvZiB0aGlzIHR5cGUgaW4gdGhlIGdpdmVuIHNldC5cbiAgfSwge1xuICAgIGtleTogXCJpc0luU2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzSW5TZXQoc2V0KSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoc2V0W2ldLnR5cGUgPT0gdGhpcykgcmV0dXJuIHNldFtpXTtcbiAgICAgIH1cbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogXCJnZXRPcmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRPcmRlcihtYXJrcykge1xuICAgICAgdmFyIHNvcnRlZCA9IFtdO1xuICAgICAgZm9yICh2YXIgX25hbWU0IGluIG1hcmtzKSB7XG4gICAgICAgIHNvcnRlZC5wdXNoKHsgbmFtZTogX25hbWU0LCByYW5rOiBtYXJrc1tfbmFtZTRdLnR5cGUucmFuayB9KTtcbiAgICAgIH1zb3J0ZWQuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICByZXR1cm4gYS5yYW5rIC0gYi5yYW5rO1xuICAgICAgfSk7XG4gICAgICB2YXIgcmFua3MgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzb3J0ZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmFua3Nbc29ydGVkW2ldLm5hbWVdID0gaTtcbiAgICAgIH1yZXR1cm4gcmFua3M7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBpbGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcGlsZShtYXJrcywgc2NoZW1hKSB7XG4gICAgICB2YXIgb3JkZXIgPSB0aGlzLmdldE9yZGVyKG1hcmtzKTtcbiAgICAgIHZhciByZXN1bHQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgZm9yICh2YXIgX25hbWU1IGluIG1hcmtzKSB7XG4gICAgICAgIHZhciBpbmZvID0gbWFya3NbX25hbWU1XTtcbiAgICAgICAgdmFyIGF0dHJzID0gaW5mby5hdHRyaWJ1dGVzIHx8IGluZm8udHlwZS5hdHRyaWJ1dGVzO1xuICAgICAgICByZXN1bHRbX25hbWU1XSA9IG5ldyBpbmZvLnR5cGUoX25hbWU1LCBhdHRycywgb3JkZXJbX25hbWU1XSwgc2NoZW1hKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJhbmtcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiA1MDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gTWFya1R5cGU7XG59KSgpO1xuXG5leHBvcnRzLk1hcmtUeXBlID0gTWFya1R5cGU7XG5NYXJrVHlwZS5hdHRyaWJ1dGVzID0ge307XG5cbi8vIDo6IChzdHJpbmcsICopXG4vLyBSZWdpc3RlciBhIG1ldGFkYXRhIGVsZW1lbnQgZm9yIHRoaXMgbWFyayB0eXBlLiBTZWUgYWxzb1xuLy8gYE5vZGVUeXBlLnJlZ2lzdGVyYC5cbk1hcmtUeXBlLnJlZ2lzdGVyID0gTm9kZVR5cGUucmVnaXN0ZXI7XG5cbi8vIFNjaGVtYSBzcGVjaWZpY2F0aW9ucyBhcmUgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgc3BlY2lmeSBhIHNjaGVtYSAtLVxuLy8gYSBzZXQgb2Ygbm9kZSB0eXBlcywgdGhlaXIgbmFtZXMsIGF0dHJpYnV0ZXMsIGFuZCBuZXN0aW5nIGJlaGF2aW9yLlxuXG5mdW5jdGlvbiBjb3B5T2JqKG9iaiwgZikge1xuICB2YXIgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgZm9yICh2YXIgcHJvcCBpbiBvYmopIHtcbiAgICByZXN1bHRbcHJvcF0gPSBmID8gZihvYmpbcHJvcF0pIDogb2JqW3Byb3BdO1xuICB9cmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZW5zdXJlV3JhcHBlZChvYmopIHtcbiAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIEZ1bmN0aW9uID8geyB0eXBlOiBvYmogfSA6IG9iajtcbn1cblxuZnVuY3Rpb24gb3ZlcmxheU9iaihvYmosIG92ZXJsYXkpIHtcbiAgdmFyIGNvcHkgPSBjb3B5T2JqKG9iaik7XG4gIGZvciAodmFyIF9uYW1lNiBpbiBvdmVybGF5KSB7XG4gICAgdmFyIGluZm8gPSBlbnN1cmVXcmFwcGVkKG92ZXJsYXlbX25hbWU2XSk7XG4gICAgaWYgKGluZm8gPT0gbnVsbCkge1xuICAgICAgZGVsZXRlIGNvcHlbX25hbWU2XTtcbiAgICB9IGVsc2UgaWYgKGluZm8udHlwZSkge1xuICAgICAgY29weVtfbmFtZTZdID0gaW5mbztcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGV4aXN0aW5nID0gY29weVtfbmFtZTZdID0gY29weU9iaihjb3B5W19uYW1lNl0pO1xuICAgICAgZm9yICh2YXIgcHJvcCBpbiBpbmZvKSB7XG4gICAgICAgIGV4aXN0aW5nW3Byb3BdID0gaW5mb1twcm9wXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvcHk7XG59XG5cbi8vIDs7IEEgc2NoZW1hIHNwZWNpZmljYXRpb24gaXMgYSBibHVlcHJpbnQgZm9yIGFuIGFjdHVhbFxuLy8gYFNjaGVtYWAuIEl0IG1hcHMgbmFtZXMgdG8gbm9kZSBhbmQgbWFyayB0eXBlcywgYWxvbmdcbi8vIHdpdGggZXh0cmEgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYWRkaXRpb25hbCBhdHRyaWJ1dGVzIGFuZCBjaGFuZ2VzXG4vLyB0byBub2RlIGtpbmRzIGFuZCByZWxhdGlvbnMuXG4vL1xuLy8gQSBzcGVjaWZpY2F0aW9uIGNvbnNpc3RzIG9mIGFuIG9iamVjdCB0aGF0IG1hcHMgbm9kZSBuYW1lcyB0byBub2RlXG4vLyB0eXBlIGNvbnN0cnVjdG9ycyBhbmQgYW5vdGhlciBzaW1pbGFyIG9iamVjdCBtYXBwaW5nIG1hcmsgbmFtZXMgdG9cbi8vIG1hcmsgdHlwZSBjb25zdHJ1Y3RvcnMuXG4vL1xuLy8gRm9yIGZsZXhpYmlsaXR5IGFuZCByZXVzYWJpbGl0eSwgbm9kZSBhbmQgbWFyayB0eXBlIGNsYXNzZXMgZG8gbm90XG4vLyBkZWNsYXJlIHRoZWlyIG93biBuYW1lLiBJbnN0ZWFkLCBlYWNoIHNjaGVtYSB0aGF0IGluY2x1ZGVzIHRoZW0gY2FuXG4vLyBhc3NpZ24gYSBuYW1lIHRvIHRoZW0sIGFzIHdlbGwgYXMgb3ZlcnJpZGUgdGhlaXJcbi8vIFtraW5kXSgjTm9kZVR5cGUua2luZCkgYW5kIFtjb250YWluZWQga2luZF0oI05vZGVUeXBlLmNvbnRhaW5zKSwgb3Jcbi8vIGFkZGluZyBleHRyYSBbYXR0cmlidXRlc10oI05vZGVUeXBlLmF0dHJpYnV0ZXMpLlxuXG52YXIgU2NoZW1hU3BlYyA9IChmdW5jdGlvbiAoKSB7XG4gIC8vIDo6ICg/T2JqZWN0PHt0eXBlOiBOb2RlVHlwZX0+LCA/T2JqZWN0PHt0eXBlOiBNYXJrVHlwZX0+KVxuICAvLyBDcmVhdGUgYSBzY2hlbWEgc3BlY2lmaWNhdGlvbiBmcm9tIHNjcmF0Y2guIFRoZSBhcmd1bWVudHMgbWFwXG4gIC8vIG5vZGUgbmFtZXMgdG8gbm9kZSB0eXBlIGNvbnN0cnVjdG9ycyBhbmQgbWFyayBuYW1lcyB0byBtYXJrIHR5cGVcbiAgLy8gY29uc3RydWN0b3JzLiBUaGVpciBwcm9wZXJ0eSB2YWx1ZSBzaG91bGQgYmUgZWl0aGVyIHRoZSB0eXBlXG4gIC8vIGNvbnN0cnVjdG9ycyB0aGVtc2VsdmVzLCBvciBvYmplY3RzIHdpdGggYSB0eXBlIGNvbnN0cnVjdG9yIHVuZGVyXG4gIC8vIHRoZWlyIGB0eXBlYCBwcm9wZXJ0eSwgYW5kIG9wdGlvbmFsbHkgdGhlc2Ugb3RoZXIgcHJvcGVydGllczpcbiAgLy9cbiAgLy8gKipgY29udGFpbnNgKipgOiBzdHJpbmdgXG4gIC8vICAgOiBPbmx5IHZhbGlkIGZvciBgbm9kZXNgLiBUaGUgW2tpbmRdKCNOb2RlVHlwZS5raW5kKSBvZiB0aGVcbiAgLy8gICAgIG5vZGVzIHRoYXQgdGhpcyBub2RlIGNhbiBjb250YWluIGluIHRoaXMgc2NoZW1hLlxuICAvL1xuICAvLyAqKmBraW5kYCoqYDogc3RyaW5nYFxuICAvLyAgOiBPbmx5IHZhbGlkIGZvciBgbm9kZXNgLiBPdmVycmlkZXMgdGhlIGtpbmQgb2YgdGhpcyBub2RlIGluXG4gIC8vICAgIHRoaXMgc2NoZW1hLiBTYW1lIGZvcm1hdCBhcyBgTm9kZVR5cGUua2luZGAuXG4gIC8vXG4gIC8vICoqYGF0dHJpYnV0ZXNgKipgOiBPYmplY3Q8QXR0cmlidXRlPmBcbiAgLy8gICA6IEV4dHJhIGF0dHJpYnV0ZXMgdG8gYXR0YWNoIHRvIHRoaXMgbm9kZSBpbiB0aGlzIHNjaGVtYS5cblxuICBmdW5jdGlvbiBTY2hlbWFTcGVjKG5vZGVzLCBtYXJrcykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBTY2hlbWFTcGVjKTtcblxuICAgIHRoaXMubm9kZXMgPSBub2RlcyA/IGNvcHlPYmoobm9kZXMsIGVuc3VyZVdyYXBwZWQpIDogT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLm1hcmtzID0gbWFya3MgPyBjb3B5T2JqKG1hcmtzLCBlbnN1cmVXcmFwcGVkKSA6IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIH1cblxuICAvLyBGb3Igbm9kZSB0eXBlcyB3aGVyZSBhbGwgYXR0cnMgaGF2ZSBhIGRlZmF1bHQgdmFsdWUgKG9yIHdoaWNoIGRvbid0XG4gIC8vIGhhdmUgYW55IGF0dHJpYnV0ZXMpLCBidWlsZCB1cCBhIHNpbmdsZSByZXVzYWJsZSBkZWZhdWx0IGF0dHJpYnV0ZVxuICAvLyBvYmplY3QsIGFuZCB1c2UgaXQgZm9yIGFsbCBub2RlcyB0aGF0IGRvbid0IHNwZWNpZnkgc3BlY2lmaWNcbiAgLy8gYXR0cmlidXRlcy5cblxuICAvLyA6OiAoP09iamVjdDw/e3R5cGU6IE5vZGVUeXBlfT4sID9PYmplY3Q8P3t0eXBlOiBNYXJrVHlwZX0+KSDihpIgU2NoZW1hU3BlY1xuICAvLyBCYXNlIGEgbmV3IHNjaGVtYSBzcGVjIG9uIHRoaXMgb25lIGJ5IHNwZWNpZnlpbmcgbm9kZXMgYW5kIG1hcmtzXG4gIC8vIHRvIGFkZCwgY2hhbmdlLCBvciByZW1vdmUuXG4gIC8vXG4gIC8vIFdoZW4gYG5vZGVzYCBpcyBwYXNzZWQsIGl0IHNob3VsZCBiZSBhbiBvYmplY3QgbWFwcGluZyB0eXBlIG5hbWVzXG4gIC8vIHRvIGVpdGhlciBgbnVsbGAsIHRvIGRlbGV0ZSB0aGUgdHlwZSBvZiB0aGF0IG5hbWUsIHRvIGFcbiAgLy8gYE5vZGVUeXBlYCwgdG8gYWRkIG9yIHJlcGxhY2UgdGhlIG5vZGUgdHlwZSBvZiB0aGF0IG5hbWUsIG9yIHRvXG4gIC8vIGFuIG9iamVjdCBjb250YWluaW5nIFtleHRlbnNpb25cbiAgLy8gcHJvcGVydGllc10oI1NjaGVtYVNwZWNfY29uc3RydWN0b3IpLCB0byBhZGQgdG8gdGhlIGV4aXN0aW5nXG4gIC8vIGRlc2NyaXB0aW9uIG9mIHRoYXQgbm9kZSB0eXBlLlxuICAvL1xuICAvLyBTaW1pbGFybHksIGBtYXJrc2AgY2FuIGJlIGFuIG9iamVjdCB0byBhZGQsIGNoYW5nZSwgb3IgcmVtb3ZlXG4gIC8vIG1hcmtzIGluIHRoZSBzY2hlbWEuXG5cbiAgX2NyZWF0ZUNsYXNzKFNjaGVtYVNwZWMsIFt7XG4gICAga2V5OiBcInVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGUobm9kZXMsIG1hcmtzKSB7XG4gICAgICByZXR1cm4gbmV3IFNjaGVtYVNwZWMobm9kZXMgPyBvdmVybGF5T2JqKHRoaXMubm9kZXMsIG5vZGVzKSA6IHRoaXMubm9kZXMsIG1hcmtzID8gb3ZlcmxheU9iaih0aGlzLm1hcmtzLCBtYXJrcykgOiB0aGlzLm1hcmtzKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoP3VuaW9uPHN0cmluZywgKG5hbWU6IHN0cmluZywgdHlwZTogTm9kZVR5cGUpIOKGkiBib29sPiwgc3RyaW5nLCBBdHRyaWJ1dGUpIOKGkiBTY2hlbWFTcGVjXG4gICAgLy8gQ3JlYXRlIGEgbmV3IHNjaGVtYSBzcGVjIHdpdGggYXR0cmlidXRlcyBhZGRlZCB0byBzZWxlY3RlZCBub2RlXG4gICAgLy8gdHlwZXMuIGBmaWx0ZXJgIGNhbiBiZSBgbnVsbGAsIHRvIGFkZCB0aGUgYXR0cmlidXRlIHRvIGFsbCBub2RlXG4gICAgLy8gdHlwZXMsIGEgc3RyaW5nLCB0byBhZGQgaXQgb25seSB0byB0aGUgbmFtZWQgbm9kZSB0eXBlLCBvciBhXG4gICAgLy8gcHJlZGljYXRlIGZ1bmN0aW9uLCB0byBhZGQgaXQgdG8gbm9kZSB0eXBlcyB0aGF0IHBhc3MgdGhlXG4gICAgLy8gcHJlZGljYXRlLlxuICAgIC8vXG4gICAgLy8gVGhpcyBhdHRyaWJ1dGUgd2lsbCBiZSBhZGRlZCBhbG9uZ3NpZGUgdGhlIG5vZGUgdHlwZSdzIFtkZWZhdWx0XG4gICAgLy8gYXR0cmlidXRlc10oI05vZGVUeXBlLmF0dHJpYnV0ZXMpLlxuICB9LCB7XG4gICAga2V5OiBcImFkZEF0dHJpYnV0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRBdHRyaWJ1dGUoZmlsdGVyLCBhdHRyTmFtZSwgYXR0cikge1xuICAgICAgdmFyIGNvcHkgPSBjb3B5T2JqKHRoaXMubm9kZXMpO1xuICAgICAgZm9yICh2YXIgX25hbWU3IGluIGNvcHkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBmaWx0ZXIgPT0gXCJzdHJpbmdcIiA/IGZpbHRlciA9PSBfbmFtZTcgOiB0eXBlb2YgZmlsdGVyID09IFwiZnVuY3Rpb25cIiA/IGZpbHRlcihfbmFtZTcsIGNvcHlbX25hbWU3XSkgOiBmaWx0ZXIgPyBmaWx0ZXIgPT0gY29weVtfbmFtZTddIDogdHJ1ZSkge1xuICAgICAgICAgIHZhciBpbmZvID0gY29weVtfbmFtZTddID0gY29weU9iaihjb3B5W19uYW1lN10pOyhpbmZvLmF0dHJpYnV0ZXMgfHwgKGluZm8uYXR0cmlidXRlcyA9IE9iamVjdC5jcmVhdGUobnVsbCkpKVthdHRyTmFtZV0gPSBhdHRyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFNjaGVtYVNwZWMoY29weSwgdGhpcy5tYXJrcyk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFNjaGVtYVNwZWM7XG59KSgpO1xuXG5leHBvcnRzLlNjaGVtYVNwZWMgPSBTY2hlbWFTcGVjO1xuZnVuY3Rpb24gZ2V0RGVmYXVsdEF0dHJzKGF0dHJzKSB7XG4gIHZhciBkZWZhdWx0cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGZvciAodmFyIGF0dHJOYW1lIGluIGF0dHJzKSB7XG4gICAgdmFyIGF0dHIgPSBhdHRyc1thdHRyTmFtZV07XG4gICAgaWYgKGF0dHJbXCJkZWZhdWx0XCJdID09IG51bGwpIHJldHVybiBudWxsO1xuICAgIGRlZmF1bHRzW2F0dHJOYW1lXSA9IGF0dHJbXCJkZWZhdWx0XCJdO1xuICB9XG4gIHJldHVybiBkZWZhdWx0cztcbn1cblxuZnVuY3Rpb24gX2J1aWxkQXR0cnMoYXR0clNwZWMsIGF0dHJzLCBhcmcxLCBhcmcyKSB7XG4gIHZhciBidWlsdCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGZvciAodmFyIF9uYW1lOCBpbiBhdHRyU3BlYykge1xuICAgIHZhciB2YWx1ZSA9IGF0dHJzICYmIGF0dHJzW19uYW1lOF07XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHZhciBhdHRyID0gYXR0clNwZWNbX25hbWU4XTtcbiAgICAgIGlmIChhdHRyW1wiZGVmYXVsdFwiXSAhPSBudWxsKSB2YWx1ZSA9IGF0dHJbXCJkZWZhdWx0XCJdO2Vsc2UgaWYgKGF0dHIuY29tcHV0ZSkgdmFsdWUgPSBhdHRyLmNvbXB1dGUoYXJnMSwgYXJnMik7ZWxzZSBTY2hlbWFFcnJvci5yYWlzZShcIk5vIHZhbHVlIHN1cHBsaWVkIGZvciBhdHRyaWJ1dGUgXCIgKyBfbmFtZTgpO1xuICAgIH1cbiAgICBidWlsdFtfbmFtZThdID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIGJ1aWx0O1xufVxuXG4vLyA7OyBFYWNoIGRvY3VtZW50IGlzIGJhc2VkIG9uIGEgc2luZ2xlIHNjaGVtYSwgd2hpY2ggcHJvdmlkZXMgdGhlXG4vLyBub2RlIGFuZCBtYXJrIHR5cGVzIHRoYXQgaXQgaXMgbWFkZSB1cCBvZiAod2hpY2gsIGluIHR1cm4sXG4vLyBkZXRlcm1pbmUgdGhlIHN0cnVjdHVyZSBpdCBpcyBhbGxvd2VkIHRvIGhhdmUpLlxuXG52YXIgU2NoZW1hID0gKGZ1bmN0aW9uICgpIHtcbiAgLy8gOjogKFNjaGVtYVNwZWMpXG4gIC8vIENvbnN0cnVjdCBhIHNjaGVtYSBmcm9tIGEgc3BlY2lmaWNhdGlvbi5cblxuICBmdW5jdGlvbiBTY2hlbWEoc3BlYykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBTY2hlbWEpO1xuXG4gICAgLy8gOjogU2NoZW1hU3BlY1xuICAgIC8vIFRoZSBzcGVjaWZpY2F0aW9uIG9uIHdoaWNoIHRoZSBzY2hlbWEgaXMgYmFzZWQuXG4gICAgdGhpcy5zcGVjID0gc3BlYztcbiAgICB0aGlzLmtpbmRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAvLyA6OiBPYmplY3Q8Tm9kZVR5cGU+XG4gICAgLy8gQW4gb2JqZWN0IG1hcHBpbmcgdGhlIHNjaGVtYSdzIG5vZGUgbmFtZXMgdG8gbm9kZSB0eXBlIG9iamVjdHMuXG4gICAgdGhpcy5ub2RlcyA9IE5vZGVUeXBlLmNvbXBpbGUoc3BlYy5ub2RlcywgdGhpcyk7XG4gICAgLy8gOjogT2JqZWN0PE1hcmtUeXBlPlxuICAgIC8vIEEgbWFwIGZyb20gbWFyayBuYW1lcyB0byBtYXJrIHR5cGUgb2JqZWN0cy5cbiAgICB0aGlzLm1hcmtzID0gTWFya1R5cGUuY29tcGlsZShzcGVjLm1hcmtzLCB0aGlzKTtcbiAgICAvLyA6OiBPYmplY3RcbiAgICAvLyBBbiBvYmplY3QgZm9yIHN0b3Jpbmcgd2hhdGV2ZXIgdmFsdWVzIG1vZHVsZXMgbWF5IHdhbnQgdG9cbiAgICAvLyBjb21wdXRlIGFuZCBjYWNoZSBwZXIgc2NoZW1hLiAoSWYgeW91IHdhbnQgdG8gc3RvcmUgc29tZXRoaW5nXG4gICAgLy8gaW4gaXQsIHRyeSB0byB1c2UgcHJvcGVydHkgbmFtZXMgdW5saWtlbHkgdG8gY2xhc2guKVxuICAgIHRoaXMuY2FjaGVkID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMudGV4dCA9IHRoaXMudGV4dC5iaW5kKHRoaXMpO1xuICAgIHRoaXMubm9kZUZyb21KU09OID0gdGhpcy5ub2RlRnJvbUpTT04uYmluZCh0aGlzKTtcbiAgICB0aGlzLm1hcmtGcm9tSlNPTiA9IHRoaXMubWFya0Zyb21KU09OLmJpbmQodGhpcyk7XG4gIH1cblxuICAvLyA6OiAodW5pb248c3RyaW5nLCBOb2RlVHlwZT4sID9PYmplY3QsID91bmlvbjxGcmFnbWVudCwgTm9kZSwgW05vZGVdPiwgP1tNYXJrXSkg4oaSIE5vZGVcbiAgLy8gQ3JlYXRlIGEgbm9kZSBpbiB0aGlzIHNjaGVtYS4gVGhlIGB0eXBlYCBtYXkgYmUgYSBzdHJpbmcgb3IgYVxuICAvLyBgTm9kZVR5cGVgIGluc3RhbmNlLiBBdHRyaWJ1dGVzIHdpbGwgYmUgZXh0ZW5kZWRcbiAgLy8gd2l0aCBkZWZhdWx0cywgYGNvbnRlbnRgIG1heSBiZSBhIGBGcmFnbWVudGAsXG4gIC8vIGBudWxsYCwgYSBgTm9kZWAsIG9yIGFuIGFycmF5IG9mIG5vZGVzLlxuICAvL1xuICAvLyBXaGVuIGNyZWF0aW5nIGEgdGV4dCBub2RlLCBgY29udGVudGAgc2hvdWxkIGJlIGEgc3RyaW5nIGFuZCBpc1xuICAvLyBpbnRlcnByZXRlZCBhcyB0aGUgbm9kZSdzIHRleHQuXG4gIC8vXG4gIC8vIFRoaXMgbWV0aG9kIGlzIGJvdW5kIHRvIHRoZSBTY2hlbWEsIG1lYW5pbmcgeW91IGRvbid0IGhhdmUgdG9cbiAgLy8gY2FsbCBpdCBhcyBhIG1ldGhvZCwgYnV0IGNhbiBwYXNzIGl0IHRvIGhpZ2hlci1vcmRlciBmdW5jdGlvbnNcbiAgLy8gYW5kIHN1Y2guXG5cbiAgX2NyZWF0ZUNsYXNzKFNjaGVtYSwgW3tcbiAgICBrZXk6IFwibm9kZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBub2RlKHR5cGUsIGF0dHJzLCBjb250ZW50LCBtYXJrcykge1xuICAgICAgaWYgKHR5cGVvZiB0eXBlID09IFwic3RyaW5nXCIpIHR5cGUgPSB0aGlzLm5vZGVUeXBlKHR5cGUpO2Vsc2UgaWYgKCEodHlwZSBpbnN0YW5jZW9mIE5vZGVUeXBlKSkgU2NoZW1hRXJyb3IucmFpc2UoXCJJbnZhbGlkIG5vZGUgdHlwZTogXCIgKyB0eXBlKTtlbHNlIGlmICh0eXBlLnNjaGVtYSAhPSB0aGlzKSBTY2hlbWFFcnJvci5yYWlzZShcIk5vZGUgdHlwZSBmcm9tIGRpZmZlcmVudCBzY2hlbWEgdXNlZCAoXCIgKyB0eXBlLm5hbWUgKyBcIilcIik7XG5cbiAgICAgIHJldHVybiB0eXBlLmNyZWF0ZShhdHRycywgY29udGVudCwgbWFya3MpO1xuICAgIH1cblxuICAgIC8vIDo6IChzdHJpbmcsID9bTWFya10pIOKGkiBOb2RlXG4gICAgLy8gQ3JlYXRlIGEgdGV4dCBub2RlIGluIHRoZSBzY2hlbWEuIFRoaXMgbWV0aG9kIGlzIGJvdW5kIHRvIHRoZSBTY2hlbWEuXG4gIH0sIHtcbiAgICBrZXk6IFwidGV4dFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0ZXh0KF90ZXh0LCBtYXJrcykge1xuICAgICAgcmV0dXJuIHRoaXMubm9kZXMudGV4dC5jcmVhdGUobnVsbCwgX3RleHQsIF9tYXJrLk1hcmsuc2V0RnJvbShtYXJrcykpO1xuICAgIH1cblxuICAgIC8vIDo6ICgpIOKGkiA/Tm9kZVR5cGVcbiAgICAvLyBSZXR1cm4gdGhlIGRlZmF1bHQgdGV4dGJsb2NrIHR5cGUgZm9yIHRoaXMgc2NoZW1hLCBvciBgbnVsbGAgaWZcbiAgICAvLyBpdCBkb2VzIG5vdCBjb250YWluIGEgbm9kZSB0eXBlIHdpdGggYSBgZGVmYXVsdFRleHRibG9ja2BcbiAgICAvLyBwcm9wZXJ0eS5cbiAgfSwge1xuICAgIGtleTogXCJkZWZhdWx0VGV4dGJsb2NrVHlwZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZWZhdWx0VGV4dGJsb2NrVHlwZSgpIHtcbiAgICAgIHZhciBjYWNoZWQgPSB0aGlzLmNhY2hlZC5kZWZhdWx0VGV4dGJsb2NrVHlwZTtcbiAgICAgIGlmIChjYWNoZWQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGNhY2hlZDtcbiAgICAgIGZvciAodmFyIF9uYW1lOSBpbiB0aGlzLm5vZGVzKSB7XG4gICAgICAgIGlmICh0aGlzLm5vZGVzW19uYW1lOV0uZGVmYXVsdFRleHRibG9jaykgcmV0dXJuIHRoaXMuY2FjaGVkLmRlZmF1bHRUZXh0YmxvY2tUeXBlID0gdGhpcy5ub2Rlc1tfbmFtZTldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkLmRlZmF1bHRUZXh0YmxvY2tUeXBlID0gbnVsbDtcbiAgICB9XG5cbiAgICAvLyA6OiAoc3RyaW5nLCA/T2JqZWN0KSDihpIgTWFya1xuICAgIC8vIENyZWF0ZSBhIG1hcmsgd2l0aCB0aGUgbmFtZWQgdHlwZVxuICB9LCB7XG4gICAga2V5OiBcIm1hcmtcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWFyayhuYW1lLCBhdHRycykge1xuICAgICAgdmFyIHNwZWMgPSB0aGlzLm1hcmtzW25hbWVdIHx8IFNjaGVtYUVycm9yLnJhaXNlKFwiTm8gbWFyayBuYW1lZCBcIiArIG5hbWUpO1xuICAgICAgcmV0dXJuIHNwZWMuY3JlYXRlKGF0dHJzKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoT2JqZWN0KSDihpIgTm9kZVxuICAgIC8vIERlc2VyaWFsaXplIGEgbm9kZSBmcm9tIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uLiBUaGlzIG1ldGhvZCBpc1xuICAgIC8vIGJvdW5kLlxuICB9LCB7XG4gICAga2V5OiBcIm5vZGVGcm9tSlNPTlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBub2RlRnJvbUpTT04oanNvbikge1xuICAgICAgcmV0dXJuIF9ub2RlLk5vZGUuZnJvbUpTT04odGhpcywganNvbik7XG4gICAgfVxuXG4gICAgLy8gOjogKE9iamVjdCkg4oaSIE1hcmtcbiAgICAvLyBEZXNlcmlhbGl6ZSBhIG1hcmsgZnJvbSBpdHMgSlNPTiByZXByZXNlbnRhdGlvbi4gVGhpcyBtZXRob2QgaXNcbiAgICAvLyBib3VuZC5cbiAgfSwge1xuICAgIGtleTogXCJtYXJrRnJvbUpTT05cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWFya0Zyb21KU09OKGpzb24pIHtcbiAgICAgIGlmICh0eXBlb2YganNvbiA9PSBcInN0cmluZ1wiKSByZXR1cm4gdGhpcy5tYXJrKGpzb24pO1xuICAgICAgcmV0dXJuIHRoaXMubWFyayhqc29uLl8sIGpzb24pO1xuICAgIH1cblxuICAgIC8vIDo6IChzdHJpbmcpIOKGkiBOb2RlVHlwZVxuICAgIC8vIEdldCB0aGUgYE5vZGVUeXBlYCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG5hbWUgaW5cbiAgICAvLyB0aGlzIHNjaGVtYSwgb3IgcmFpc2UgYW4gZXJyb3IgaWYgaXQgZG9lcyBub3QgZXhpc3QuXG4gIH0sIHtcbiAgICBrZXk6IFwibm9kZVR5cGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbm9kZVR5cGUobmFtZSkge1xuICAgICAgcmV0dXJuIHRoaXMubm9kZXNbbmFtZV0gfHwgU2NoZW1hRXJyb3IucmFpc2UoXCJVbmtub3duIG5vZGUgdHlwZTogXCIgKyBuYW1lKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoc3RyaW5nLCBzdHJpbmcpIOKGkiBib29sXG4gICAgLy8gVGVzdCB3aGV0aGVyIGEgbm9kZSBraW5kIGlzIGEgc3ViLWtpbmQgb2YgYW5vdGhlciBraW5kLlxuICB9LCB7XG4gICAga2V5OiBcInN1YktpbmRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3ViS2luZChzdWIsIHN1cCkge1xuICAgICAgZm9yICg7Oykge1xuICAgICAgICBpZiAoc3ViID09IHN1cCkgcmV0dXJuIHRydWU7XG4gICAgICAgIHN1YiA9IHRoaXMua2luZHNbc3ViXTtcbiAgICAgICAgaWYgKCFzdWIpIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA6OiAoc3RyaW5nLCAodmFsdWU6ICosIHNvdXJjZTogdW5pb248Tm9kZVR5cGUsIE1hcmtUeXBlLCBBdHRyaWJ1dGU+KSlcbiAgICAvLyBSZXRyaWV2ZSBhbGwgcmVnaXN0ZXJlZCBpdGVtcyB1bmRlciB0aGUgZ2l2ZW4gbmFtZSBmcm9tIHRoaXNcbiAgICAvLyBzY2hlbWEuIFRoZSBnaXZlbiBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aXRoIGVhY2ggaXRlbSBhbmQsIGFzXG4gICAgLy8gYSBzZWNvbmQgYXJndW1lbnQsIHRoZSBlbGVtZW504oCUbm9kZSB0eXBlLCBtYXJrIHR5cGUsIG9yXG4gICAgLy8gYXR0cmlidXRl4oCUdGhhdCBpdCB3YXMgYXNzb2NpYXRlZCB3aXRoLlxuICB9LCB7XG4gICAga2V5OiBcInJlZ2lzdHJ5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlZ2lzdHJ5KG5hbWUsIGYpIHtcbiAgICAgIHZhciBhdHRyc1NlZW4gPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjsgaSsrKSB7XG4gICAgICAgIHZhciBvYmogPSBpID8gdGhpcy5tYXJrcyA6IHRoaXMubm9kZXM7XG4gICAgICAgIGZvciAodmFyIHRuYW1lIGluIG9iaikge1xuICAgICAgICAgIHZhciB0eXBlID0gb2JqW3RuYW1lXTtcbiAgICAgICAgICBpZiAodHlwZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkoXCJyZWdpc3RyeVwiKSkge1xuICAgICAgICAgICAgdmFyIHJlZyA9IHR5cGUucmVnaXN0cnlbbmFtZV07XG4gICAgICAgICAgICBpZiAocmVnKSBmb3IgKHZhciBqID0gMDsgaiA8IHJlZy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICBmKHJlZ1tqXSwgdHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAodmFyIGFuYW1lIGluIHR5cGUuYXR0cnMpIHtcbiAgICAgICAgICAgIHZhciBhdHRyID0gdHlwZS5hdHRyc1thbmFtZV0sXG4gICAgICAgICAgICAgICAgcmVnID0gYXR0ci5yZWdpc3RyeVtuYW1lXTtcbiAgICAgICAgICAgIGlmIChyZWcgJiYgYXR0cnNTZWVuLmluZGV4T2YoYXR0cikgPT0gLTEpIHtcbiAgICAgICAgICAgICAgYXR0cnNTZWVuLnB1c2goYXR0cik7XG4gICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcmVnLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgZihyZWdbal0sIGF0dHIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFNjaGVtYTtcbn0pKCk7XG5cbmV4cG9ydHMuU2NoZW1hID0gU2NoZW1hOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbmV4cG9ydHMuZnJvbURPTSA9IGZyb21ET007XG5leHBvcnRzLmZyb21IVE1MID0gZnJvbUhUTUw7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBfbW9kZWwgPSByZXF1aXJlKFwiLi4vbW9kZWxcIik7XG5cbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9pbmRleFwiKTtcblxuLy8gOjogKFNjaGVtYSwgRE9NTm9kZSwgP09iamVjdCkg4oaSIE5vZGVcbi8vIFBhcnNlIGRvY3VtZW50IGZyb20gdGhlIGNvbnRlbnQgb2YgYSBET00gbm9kZS4gVG8gcGFzcyBhbiBleHBsaWNpdFxuLy8gcGFyZW50IGRvY3VtZW50IChmb3IgZXhhbXBsZSwgd2hlbiBub3QgaW4gYSBicm93c2VyIHdpbmRvd1xuLy8gZW52aXJvbm1lbnQsIHdoZXJlIHdlIHNpbXBseSB1c2UgdGhlIGdsb2JhbCBkb2N1bWVudCksIHBhc3MgaXQgYXNcbi8vIHRoZSBgZG9jdW1lbnRgIHByb3BlcnR5IG9mIGBvcHRpb25zYC5cblxuZnVuY3Rpb24gZnJvbURPTShzY2hlbWEsIGRvbSwgb3B0aW9ucykge1xuICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fTtcbiAgdmFyIGNvbnRleHQgPSBuZXcgRE9NUGFyc2VTdGF0ZShzY2hlbWEsIG9wdGlvbnMudG9wTm9kZSB8fCBzY2hlbWEubm9kZShcImRvY1wiKSwgb3B0aW9ucyk7XG4gIHZhciBzdGFydCA9IG9wdGlvbnMuZnJvbSA/IGRvbS5jaGlsZE5vZGVzW29wdGlvbnMuZnJvbV0gOiBkb20uZmlyc3RDaGlsZDtcbiAgdmFyIGVuZCA9IG9wdGlvbnMudG8gIT0gbnVsbCAmJiBkb20uY2hpbGROb2Rlc1tvcHRpb25zLnRvXSB8fCBudWxsO1xuICBjb250ZXh0LmFkZEFsbChzdGFydCwgZW5kLCB0cnVlKTtcbiAgdmFyIGRvYyA9IHVuZGVmaW5lZDtcbiAgd2hpbGUgKGNvbnRleHQuc3RhY2subGVuZ3RoKSBkb2MgPSBjb250ZXh0LmxlYXZlKCk7XG4gIHJldHVybiBkb2M7XG59XG5cbi8vIDs7ICNwYXRoPURPTVBhcnNlU3BlYyAja2luZD1pbnRlcmZhY2UgI3RvYz1mYWxzZVxuLy8gVG8gZGVmaW5lIHRoZSB3YXkgW25vZGVdKCNOb2RlVHlwZSkgYW5kIFttYXJrXSgjTWFya1R5cGUpIHR5cGVzIGFyZVxuLy8gcGFyc2VkLCB5b3UgY2FuIGFzc29jaWF0ZSBvbmUgb3IgbW9yZSBET00gcGFyc2luZyBzcGVjaWZpY2F0aW9ucyB0b1xuLy8gdGhlbSB1c2luZyB0aGUgW2ByZWdpc3RlcmBdKCNOb2RlVHlwZS5yZWdpc3RlcikgbWV0aG9kIHdpdGggdGhlXG4vLyBgcGFyc2VET01gIHByb3BlcnR5IG5hbWUuIEVhY2ggb2YgdGhlbSBkZWZpbmVzIGEgcGFyc2luZyBzdHJhdGVneVxuLy8gZm9yIGEgY2VydGFpbiB0eXBlIG9mIERPTSBub2RlLlxuLy9cbi8vIE5vdGUgdGhhdCBgQXR0cmlidXRlYHMgbWF5IGFsc28gY29udGFpbiBhIGBwYXJzZURPTWAgcHJvcGVydHksXG4vLyB3aGljaCBzaG91bGQgX25vdF8gYmUgYSBgRE9NUGFyc2VTcGVjYCwgYnV0IHNpbXBseSBhIGZ1bmN0aW9uIHRoYXRcbi8vIGNvbXB1dGVzIHRoZSBhdHRyaWJ1dGUncyB2YWx1ZSBmcm9tIGEgRE9NIG5vZGUuXG5cbi8vIDo6ID9zdHJpbmcgI3BhdGg9RE9NUGFyc2VTcGVjLnRhZ1xuLy8gVGhlIChsb3dlci1jYXNlKSB0YWcgbmFtZSBmb3Igd2hpY2ggdG8gYWN0aXZhdGUgdGhpcyBwYXJzZXIuIFdoZW5cbi8vIG5vdCBnaXZlbiwgaXQgaXMgYWN0aXZhdGVkIGZvciBhbGwgbm9kZXMuXG5cbi8vIDo6ID9udW1iZXIgI3BhdGg9RE9NUGFyc2VTcGVjLnJhbmtcbi8vIFRoZSBwcmVjZWRlbmNlIG9mIHRoaXMgcGFyc2luZyBzdHJhdGVneS4gU2hvdWxkIGJlIGEgbnVtYmVyIGJldHdlZW5cbi8vIDAgYW5kIDEwMCwgd2hpY2ggZGV0ZXJtaW5lcyB3aGVuIHRoaXMgcGFyc2VyIGdldHMgYSBjaGFuY2UgcmVsYXRpdmVcbi8vIHRvIG90aGVycyB0aGF0IGFwcGx5IHRvIHRoZSBub2RlIChsb3cgcmFua3MgZ28gZmlyc3QpLiBEZWZhdWx0cyB0b1xuLy8gNTAuXG5cbi8vIDo6IHVuaW9uPHN0cmluZywgKGRvbTogRE9NTm9kZSwgc3RhdGU6IERPTVBhcnNlU3RhdGUpIOKGkiA/Ym9vbD4gI3BhdGg9RE9NUGFyc2VTcGVjLnBhcnNlXG4vLyBUaGUgZnVuY3Rpb24gdGhhdCwgZ2l2ZW4gYSBET00gbm9kZSwgcGFyc2VzIGl0LCB1cGRhdGluZyB0aGUgcGFyc2Vcbi8vIHN0YXRlLiBJdCBzaG91bGQgcmV0dXJuICh0aGUgZXhhY3QgdmFsdWUpIGBmYWxzZWAgd2hlbiBpdCB3YW50cyB0b1xuLy8gaW5kaWNhdGUgdGhhdCBpdCB3YXMgbm90IGFibGUgdG8gcGFyc2UgdGhpcyBub2RlLiBUaGlzIGZ1bmN0aW9uIGlzXG4vLyBjYWxsZWQgaW4gc3VjaCBhIHdheSB0aGF0IGB0aGlzYCBpcyBib3VuZCB0byB0aGUgdHlwZSB0aGF0IHRoZVxuLy8gcGFyc2Ugc3BlYyB3YXMgYXNzb2NpYXRlZCB3aXRoLlxuLy9cbi8vIFdoZW4gdGhpcyBpcyBzZXQgdG8gdGhlIHN0cmluZyBgXCJibG9ja1wiYCwgdGhlIGNvbnRlbnQgb2YgdGhlIERPTVxuLy8gbm9kZSBpcyBwYXJzZWQgYXMgdGhlIGNvbnRlbnQgaW4gYSBub2RlIG9mIHRoZSB0eXBlIHRoYXQgdGhpcyBzcGVjXG4vLyB3YXMgYXNzb2NpYXRlZCB3aXRoLlxuLy9cbi8vIFdoZW4gc2V0IHRvIHRoZSBzdHJpbmcgYFwibWFya1wiYCwgdGhlIGNvbnRlbnQgb2YgdGhlIERPTSBub2RlIGlzXG4vLyBwYXJzZWQgd2l0aCBhbiBpbnN0YW5jZSBvZiB0aGUgbWFyayB0aGF0IHRoaXMgc3BlYyB3YXMgYXNzb2NpYXRlZFxuLy8gd2l0aCBhZGRlZCB0byB0aGVpciBtYXJrcy5cblxuKDAsIF9pbmRleC5kZWZpbmVTb3VyY2UpKFwiZG9tXCIsIGZyb21ET00pO1xuXG4vLyA6OiAoU2NoZW1hLCBzdHJpbmcsID9PYmplY3QpIOKGkiBOb2RlXG4vLyBQYXJzZXMgdGhlIEhUTUwgaW50byBhIERPTSwgYW5kIHRoZW4gY2FsbHMgdGhyb3VnaCB0byBgZnJvbURPTWAuXG5cbmZ1bmN0aW9uIGZyb21IVE1MKHNjaGVtYSwgaHRtbCwgb3B0aW9ucykge1xuICB2YXIgd3JhcCA9IChvcHRpb25zICYmIG9wdGlvbnMuZG9jdW1lbnQgfHwgd2luZG93LmRvY3VtZW50KS5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICB3cmFwLmlubmVySFRNTCA9IGh0bWw7XG4gIHJldHVybiBmcm9tRE9NKHNjaGVtYSwgd3JhcCwgb3B0aW9ucyk7XG59XG5cbigwLCBfaW5kZXguZGVmaW5lU291cmNlKShcImh0bWxcIiwgZnJvbUhUTUwpO1xuXG52YXIgYmxvY2tFbGVtZW50cyA9IHtcbiAgYWRkcmVzczogdHJ1ZSwgYXJ0aWNsZTogdHJ1ZSwgYXNpZGU6IHRydWUsIGJsb2NrcXVvdGU6IHRydWUsIGNhbnZhczogdHJ1ZSxcbiAgZGQ6IHRydWUsIGRpdjogdHJ1ZSwgZGw6IHRydWUsIGZpZWxkc2V0OiB0cnVlLCBmaWdjYXB0aW9uOiB0cnVlLCBmaWd1cmU6IHRydWUsXG4gIGZvb3RlcjogdHJ1ZSwgZm9ybTogdHJ1ZSwgaDE6IHRydWUsIGgyOiB0cnVlLCBoMzogdHJ1ZSwgaDQ6IHRydWUsIGg1OiB0cnVlLFxuICBoNjogdHJ1ZSwgaGVhZGVyOiB0cnVlLCBoZ3JvdXA6IHRydWUsIGhyOiB0cnVlLCBsaTogdHJ1ZSwgbm9zY3JpcHQ6IHRydWUsIG9sOiB0cnVlLFxuICBvdXRwdXQ6IHRydWUsIHA6IHRydWUsIHByZTogdHJ1ZSwgc2VjdGlvbjogdHJ1ZSwgdGFibGU6IHRydWUsIHRmb290OiB0cnVlLCB1bDogdHJ1ZVxufTtcblxudmFyIG5vTWFya3MgPSBbXTtcblxuLy8gOzsgI3RvYz1mYWxzZSBBIHN0YXRlIG9iamVjdCB1c2VkIHRvIHRyYWNrIGNvbnRleHQgZHVyaW5nIGEgcGFyc2UsXG4vLyBhbmQgdG8gZXhwb3NlIG1ldGhvZHMgdG8gY3VzdG9tIHBhcnNpbmcgZnVuY3Rpb25zLlxuXG52YXIgRE9NUGFyc2VTdGF0ZSA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIERPTVBhcnNlU3RhdGUoc2NoZW1hLCB0b3BOb2RlLCBvcHRpb25zKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIERPTVBhcnNlU3RhdGUpO1xuXG4gICAgLy8gOjogT2JqZWN0IFRoZSBvcHRpb25zIHBhc3NlZCB0byB0aGlzIHBhcnNlLlxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgLy8gOjogU2NoZW1hIFRoZSBzY2hlbWEgdGhhdCB3ZSBhcmUgcGFyc2luZyBpbnRvLlxuICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgIHRoaXMuc3RhY2sgPSBbXTtcbiAgICB0aGlzLm1hcmtzID0gbm9NYXJrcztcbiAgICB0aGlzLmNsb3NpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmVudGVyKHRvcE5vZGUudHlwZSwgdG9wTm9kZS5hdHRycyk7XG4gICAgdGhpcy5ub2RlSW5mbyA9IG5vZGVJbmZvKHNjaGVtYSk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoRE9NUGFyc2VTdGF0ZSwgW3tcbiAgICBrZXk6IFwicGFyc2VBdHRyc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXJzZUF0dHJzKGRvbSwgdHlwZSwgYXR0cnMpIHtcbiAgICAgIGZvciAodmFyIGF0dHIgaW4gdHlwZS5hdHRycykge1xuICAgICAgICB2YXIgZGVzYyA9IHR5cGUuYXR0cnNbYXR0cl07XG4gICAgICAgIGlmIChkZXNjLnBhcnNlRE9NICYmICghYXR0cnMgfHwgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhdHRycywgYXR0cikpKSB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gZGVzYy5wYXJzZURPTShkb20sIHRoaXMub3B0aW9ucywgZGVzYywgdHlwZSk7XG4gICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmICghYXR0cnMpIGF0dHJzID0ge307XG4gICAgICAgICAgICBhdHRyc1thdHRyXSA9IHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGF0dHJzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhZGRET01cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkRE9NKGRvbSkge1xuICAgICAgaWYgKGRvbS5ub2RlVHlwZSA9PSAzKSB7XG4gICAgICAgIC8vIEZJWE1FIGRlZmluZSBhIGNvaGVyZW50IHN0cmF0ZWd5IGZvciBkZWFsaW5nIHdpdGggdHJhaWxpbmcsIGxlYWRpbmcsIGFuZCBtdWx0aXBsZSBzcGFjZXMgKHRoaXMgaXNuJ3Qgb25lKVxuICAgICAgICB2YXIgdmFsdWUgPSBkb20ubm9kZVZhbHVlO1xuICAgICAgICB2YXIgX3RvcCA9IHRoaXMudG9wLFxuICAgICAgICAgICAgbGFzdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKC9cXFMvLnRlc3QodmFsdWUpIHx8IF90b3AudHlwZS5pc1RleHRibG9jaykge1xuICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXFxzKy9nLCBcIiBcIik7XG4gICAgICAgICAgaWYgKC9eXFxzLy50ZXN0KHZhbHVlKSAmJiAobGFzdCA9IF90b3AuY29udGVudFtfdG9wLmNvbnRlbnQubGVuZ3RoIC0gMV0pICYmIGxhc3QudHlwZS5uYW1lID09IFwidGV4dFwiICYmIC9cXHMkLy50ZXN0KGxhc3QudGV4dCkpIHZhbHVlID0gdmFsdWUuc2xpY2UoMSk7XG4gICAgICAgICAgaWYgKHZhbHVlKSB0aGlzLmluc2VydCh0aGlzLnNjaGVtYS50ZXh0KHZhbHVlLCB0aGlzLm1hcmtzKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZG9tLm5vZGVUeXBlICE9IDEgfHwgZG9tLmhhc0F0dHJpYnV0ZShcInBtLWlnbm9yZVwiKSkge1xuICAgICAgICAvLyBJZ25vcmUgbm9uLXRleHQgbm9uLWVsZW1lbnQgbm9kZXNcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMucGFyc2VOb2RlVHlwZShkb20pKSB7XG4gICAgICAgICAgdGhpcy5hZGRBbGwoZG9tLmZpcnN0Q2hpbGQsIG51bGwpO1xuICAgICAgICAgIHZhciBfbmFtZSA9IGRvbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGlmIChibG9ja0VsZW1lbnRzLmhhc093blByb3BlcnR5KF9uYW1lKSAmJiB0aGlzLnRvcC50eXBlID09IHRoaXMuc2NoZW1hLmRlZmF1bHRUZXh0YmxvY2tUeXBlKCkpIHRoaXMuY2xvc2luZyA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidHJ5UGFyc2Vyc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0cnlQYXJzZXJzKHBhcnNlcnMsIGRvbSkge1xuICAgICAgaWYgKHBhcnNlcnMpIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyc2Vycy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcGFyc2VyID0gcGFyc2Vyc1tpXTtcbiAgICAgICAgaWYgKHBhcnNlci5wYXJzZS5jYWxsKHBhcnNlci50eXBlLCBkb20sIHRoaXMpICE9PSBmYWxzZSkgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBhcnNlTm9kZVR5cGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGFyc2VOb2RlVHlwZShkb20pIHtcbiAgICAgIHJldHVybiB0aGlzLnRyeVBhcnNlcnModGhpcy5ub2RlSW5mb1tkb20ubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0sIGRvbSkgfHwgdGhpcy50cnlQYXJzZXJzKHRoaXMubm9kZUluZm8uXywgZG9tKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkQWxsXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZEFsbChmcm9tLCB0bywgc3luYykge1xuICAgICAgdmFyIHN0YWNrID0gc3luYyAmJiB0aGlzLnN0YWNrLnNsaWNlKCk7XG4gICAgICBmb3IgKHZhciBkb20gPSBmcm9tOyBkb20gIT0gdG87IGRvbSA9IGRvbS5uZXh0U2libGluZykge1xuICAgICAgICB0aGlzLmFkZERPTShkb20pO1xuICAgICAgICBpZiAoc3luYyAmJiBibG9ja0VsZW1lbnRzLmhhc093blByb3BlcnR5KGRvbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSkgdGhpcy5zeW5jKHN0YWNrKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZG9DbG9zZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkb0Nsb3NlKCkge1xuICAgICAgaWYgKCF0aGlzLmNsb3NpbmcgfHwgdGhpcy5zdGFjay5sZW5ndGggPCAyKSByZXR1cm47XG4gICAgICB2YXIgbGVmdCA9IHRoaXMubGVhdmUoKTtcbiAgICAgIHRoaXMuZW50ZXIobGVmdC50eXBlLCBsZWZ0LmF0dHJzKTtcbiAgICAgIHRoaXMuY2xvc2luZyA9IGZhbHNlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbnNlcnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5zZXJ0KG5vZGUpIHtcbiAgICAgIGlmICh0aGlzLnRvcC50eXBlLmNhbkNvbnRhaW4obm9kZSkpIHtcbiAgICAgICAgdGhpcy5kb0Nsb3NlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKHZhciBpID0gdGhpcy5zdGFjay5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIHZhciByb3V0ZSA9IHRoaXMuc3RhY2tbaV0udHlwZS5maW5kQ29ubmVjdGlvbihub2RlLnR5cGUpO1xuICAgICAgICAgIGlmICghcm91dGUpIGNvbnRpbnVlO1xuICAgICAgICAgIGlmIChpID09IHRoaXMuc3RhY2subGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgdGhpcy5kb0Nsb3NlKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdoaWxlICh0aGlzLnN0YWNrLmxlbmd0aCA+IGkgKyAxKSB0aGlzLmxlYXZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcm91dGUubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIHRoaXMuZW50ZXIocm91dGVbal0pO1xuICAgICAgICAgIH1pZiAodGhpcy5tYXJrcy5sZW5ndGgpIHRoaXMubWFya3MgPSBub01hcmtzO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnRvcC5jb250ZW50LnB1c2gobm9kZSk7XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG5cbiAgICAvLyA6OiAoRE9NTm9kZSwgTm9kZVR5cGUsID9PYmplY3QsIFtOb2RlXSkg4oaSIE5vZGVcbiAgICAvLyBJbnNlcnQgYSBub2RlIG9mIHRoZSBnaXZlbiB0eXBlLCB3aXRoIHRoZSBnaXZlbiBjb250ZW50LCBiYXNlZCBvblxuICAgIC8vIGBkb21gLCBhdCB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgZG9jdW1lbnQuXG4gIH0sIHtcbiAgICBrZXk6IFwiaW5zZXJ0RnJvbVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnNlcnRGcm9tKGRvbSwgdHlwZSwgYXR0cnMsIGNvbnRlbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLmluc2VydCh0eXBlLmNyZWF0ZUF1dG9GaWxsKHRoaXMucGFyc2VBdHRycyhkb20sIHR5cGUsIGF0dHJzKSwgY29udGVudCwgdGhpcy5tYXJrcykpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJlbnRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlbnRlcih0eXBlLCBhdHRycykge1xuICAgICAgaWYgKHRoaXMubWFya3MubGVuZ3RoKSB0aGlzLm1hcmtzID0gbm9NYXJrcztcbiAgICAgIHRoaXMuc3RhY2sucHVzaCh7IHR5cGU6IHR5cGUsIGF0dHJzOiBhdHRycywgY29udGVudDogW10gfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVudGVyRnJvbVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlbnRlckZyb20oZG9tLCB0eXBlLCBhdHRycykge1xuICAgICAgdGhpcy5lbnRlcih0eXBlLCB0aGlzLnBhcnNlQXR0cnMoZG9tLCB0eXBlLCBhdHRycykpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJsZWF2ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsZWF2ZSgpIHtcbiAgICAgIHZhciB0b3AgPSB0aGlzLnN0YWNrLnBvcCgpO1xuICAgICAgdmFyIG5vZGUgPSB0b3AudHlwZS5jcmVhdGVBdXRvRmlsbCh0b3AuYXR0cnMsIHRvcC5jb250ZW50KTtcbiAgICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCkgdGhpcy5pbnNlcnQobm9kZSk7XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic3luY1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzeW5jKHN0YWNrKSB7XG4gICAgICB3aGlsZSAodGhpcy5zdGFjay5sZW5ndGggPiBzdGFjay5sZW5ndGgpIHRoaXMubGVhdmUoKTtcbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgdmFyIG4gPSB0aGlzLnN0YWNrLmxlbmd0aCAtIDEsXG4gICAgICAgICAgICBvbmUgPSB0aGlzLnN0YWNrW25dLFxuICAgICAgICAgICAgdHdvID0gc3RhY2tbbl07XG4gICAgICAgIGlmIChvbmUudHlwZSA9PSB0d28udHlwZSAmJiBfbW9kZWwuTm9kZS5zYW1lQXR0cnMob25lLmF0dHJzLCB0d28uYXR0cnMpKSBicmVhaztcbiAgICAgICAgdGhpcy5sZWF2ZSgpO1xuICAgICAgfVxuICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IHRoaXMuc3RhY2subGVuZ3RoKSB7XG4gICAgICAgIHZhciBhZGQgPSBzdGFja1t0aGlzLnN0YWNrLmxlbmd0aF07XG4gICAgICAgIHRoaXMuZW50ZXIoYWRkLnR5cGUsIGFkZC5hdHRycyk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5tYXJrcy5sZW5ndGgpIHRoaXMubWFya3MgPSBub01hcmtzO1xuICAgICAgdGhpcy5jbG9zaW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gOjogKERPTU5vZGUsIE5vZGVUeXBlLCA/T2JqZWN0KVxuICAgIC8vIFBhcnNlIHRoZSBjb250ZW50cyBvZiBgZG9tYCBhcyBjaGlsZHJlbiBvZiBhIG5vZGUgb2YgdGhlIGdpdmVuXG4gICAgLy8gdHlwZS5cbiAgfSwge1xuICAgIGtleTogXCJ3cmFwSW5cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gd3JhcEluKGRvbSwgdHlwZSwgYXR0cnMpIHtcbiAgICAgIHRoaXMuZW50ZXJGcm9tKGRvbSwgdHlwZSwgYXR0cnMpO1xuICAgICAgdGhpcy5hZGRBbGwoZG9tLmZpcnN0Q2hpbGQsIG51bGwsIHRydWUpO1xuICAgICAgdGhpcy5sZWF2ZSgpO1xuICAgIH1cblxuICAgIC8vIDo6IChET01Ob2RlLCBNYXJrKVxuICAgIC8vIFBhcnNlIHRoZSBjb250ZW50cyBvZiBgZG9tYCwgd2l0aCBgbWFya2AgYWRkZWQgdG8gdGhlIHNldCBvZlxuICAgIC8vIGN1cnJlbnQgbWFya3MuXG4gIH0sIHtcbiAgICBrZXk6IFwid3JhcE1hcmtcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gd3JhcE1hcmsoZG9tLCBtYXJrKSB7XG4gICAgICB2YXIgb2xkID0gdGhpcy5tYXJrcztcbiAgICAgIHRoaXMubWFya3MgPSAobWFyay5pbnN0YW5jZSB8fCBtYXJrKS5hZGRUb1NldChvbGQpO1xuICAgICAgdGhpcy5hZGRBbGwoZG9tLmZpcnN0Q2hpbGQsIG51bGwpO1xuICAgICAgdGhpcy5tYXJrcyA9IG9sZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidG9wXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBET01QYXJzZVN0YXRlO1xufSkoKTtcblxuZnVuY3Rpb24gbm9kZUluZm8oc2NoZW1hKSB7XG4gIHJldHVybiBzY2hlbWEuY2FjaGVkLnBhcnNlRE9NTm9kZXMgfHwgKHNjaGVtYS5jYWNoZWQucGFyc2VET01Ob2RlcyA9IHN1bW1hcml6ZU5vZGVJbmZvKHNjaGVtYSkpO1xufVxuXG5mdW5jdGlvbiBzdW1tYXJpemVOb2RlSW5mbyhzY2hlbWEpIHtcbiAgdmFyIHRhZ3MgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB0YWdzLl8gPSBbXTtcbiAgc2NoZW1hLnJlZ2lzdHJ5KFwicGFyc2VET01cIiwgZnVuY3Rpb24gKGluZm8sIHR5cGUpIHtcbiAgICB2YXIgdGFnID0gaW5mby50YWcgfHwgXCJfXCI7XG4gICAgdmFyIHBhcnNlID0gaW5mby5wYXJzZTtcbiAgICBpZiAocGFyc2UgPT0gXCJibG9ja1wiKSBwYXJzZSA9IGZ1bmN0aW9uIChkb20sIHN0YXRlKSB7XG4gICAgICBzdGF0ZS53cmFwSW4oZG9tLCB0aGlzKTtcbiAgICB9O2Vsc2UgaWYgKHBhcnNlID09IFwibWFya1wiKSBwYXJzZSA9IGZ1bmN0aW9uIChkb20sIHN0YXRlKSB7XG4gICAgICBzdGF0ZS53cmFwTWFyayhkb20sIHRoaXMpO1xuICAgIH07KHRhZ3NbdGFnXSB8fCAodGFnc1t0YWddID0gW10pKS5wdXNoKHtcbiAgICAgIHR5cGU6IHR5cGUsIHBhcnNlOiBwYXJzZSxcbiAgICAgIHJhbms6IGluZm8ucmFuayA9PSBudWxsID8gNTAgOiBpbmZvLnJhbmtcbiAgICB9KTtcbiAgfSk7XG4gIGZvciAodmFyIHRhZyBpbiB0YWdzKSB7XG4gICAgdGFnc1t0YWddLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBhLnJhbmsgLSBiLnJhbms7XG4gICAgfSk7XG4gIH1yZXR1cm4gdGFncztcbn1cblxuX21vZGVsLlBhcmFncmFwaC5yZWdpc3RlcihcInBhcnNlRE9NXCIsIHsgdGFnOiBcInBcIiwgcGFyc2U6IFwiYmxvY2tcIiB9KTtcblxuX21vZGVsLkJsb2NrUXVvdGUucmVnaXN0ZXIoXCJwYXJzZURPTVwiLCB7IHRhZzogXCJibG9ja3F1b3RlXCIsIHBhcnNlOiBcImJsb2NrXCIgfSk7XG5cbnZhciBfbG9vcCA9IGZ1bmN0aW9uIChpKSB7XG4gIF9tb2RlbC5IZWFkaW5nLnJlZ2lzdGVyKFwicGFyc2VET01cIiwge1xuICAgIHRhZzogXCJoXCIgKyBpLFxuICAgIHBhcnNlOiBmdW5jdGlvbiBwYXJzZShkb20sIHN0YXRlKSB7XG4gICAgICBzdGF0ZS53cmFwSW4oZG9tLCB0aGlzLCB7IGxldmVsOiBpIH0pO1xuICAgIH1cbiAgfSk7XG59O1xuXG5mb3IgKHZhciBpID0gMTsgaSA8PSA2OyBpKyspIHtcbiAgX2xvb3AoaSk7XG59X21vZGVsLkhvcml6b250YWxSdWxlLnJlZ2lzdGVyKFwicGFyc2VET01cIiwgeyB0YWc6IFwiaHJcIiwgcGFyc2U6IFwiYmxvY2tcIiB9KTtcblxuX21vZGVsLkNvZGVCbG9jay5yZWdpc3RlcihcInBhcnNlRE9NXCIsIHsgdGFnOiBcInByZVwiLCBwYXJzZTogZnVuY3Rpb24gcGFyc2UoZG9tLCBzdGF0ZSkge1xuICAgIHZhciBwYXJhbXMgPSBkb20uZmlyc3RDaGlsZCAmJiAvXmNvZGUkL2kudGVzdChkb20uZmlyc3RDaGlsZC5ub2RlTmFtZSkgJiYgZG9tLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKFwiY2xhc3NcIik7XG4gICAgaWYgKHBhcmFtcyAmJiAvZmVuY2UvLnRlc3QocGFyYW1zKSkge1xuICAgICAgdmFyIGZvdW5kID0gW10sXG4gICAgICAgICAgcmUgPSAvKD86XnxcXHMpbGFuZy0oXFxTKykvZyxcbiAgICAgICAgICBtID0gdW5kZWZpbmVkO1xuICAgICAgd2hpbGUgKG0gPSByZS50ZXN0KHBhcmFtcykpIGZvdW5kLnB1c2gobVsxXSk7XG4gICAgICBwYXJhbXMgPSBmb3VuZC5qb2luKFwiIFwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyYW1zID0gbnVsbDtcbiAgICB9XG4gICAgdmFyIHRleHQgPSBkb20udGV4dENvbnRlbnQ7XG4gICAgc3RhdGUuaW5zZXJ0RnJvbShkb20sIHRoaXMsIHsgcGFyYW1zOiBwYXJhbXMgfSwgdGV4dCA/IFtzdGF0ZS5zY2hlbWEudGV4dCh0ZXh0KV0gOiBbXSk7XG4gIH0gfSk7XG5cbl9tb2RlbC5CdWxsZXRMaXN0LnJlZ2lzdGVyKFwicGFyc2VET01cIiwgeyB0YWc6IFwidWxcIiwgcGFyc2U6IFwiYmxvY2tcIiB9KTtcblxuX21vZGVsLk9yZGVyZWRMaXN0LnJlZ2lzdGVyKFwicGFyc2VET01cIiwgeyB0YWc6IFwib2xcIiwgcGFyc2U6IGZ1bmN0aW9uIHBhcnNlKGRvbSwgc3RhdGUpIHtcbiAgICB2YXIgYXR0cnMgPSB7IG9yZGVyOiBkb20uZ2V0QXR0cmlidXRlKFwic3RhcnRcIikgfHwgMSB9O1xuICAgIHN0YXRlLndyYXBJbihkb20sIHRoaXMsIGF0dHJzKTtcbiAgfSB9KTtcblxuX21vZGVsLkxpc3RJdGVtLnJlZ2lzdGVyKFwicGFyc2VET01cIiwgeyB0YWc6IFwibGlcIiwgcGFyc2U6IFwiYmxvY2tcIiB9KTtcblxuX21vZGVsLkhhcmRCcmVhay5yZWdpc3RlcihcInBhcnNlRE9NXCIsIHsgdGFnOiBcImJyXCIsIHBhcnNlOiBmdW5jdGlvbiBwYXJzZShkb20sIHN0YXRlKSB7XG4gICAgc3RhdGUuaW5zZXJ0RnJvbShkb20sIHRoaXMpO1xuICB9IH0pO1xuXG5fbW9kZWwuSW1hZ2UucmVnaXN0ZXIoXCJwYXJzZURPTVwiLCB7IHRhZzogXCJpbWdcIiwgcGFyc2U6IGZ1bmN0aW9uIHBhcnNlKGRvbSwgc3RhdGUpIHtcbiAgICBzdGF0ZS5pbnNlcnRGcm9tKGRvbSwgdGhpcywge1xuICAgICAgc3JjOiBkb20uZ2V0QXR0cmlidXRlKFwic3JjXCIpLFxuICAgICAgdGl0bGU6IGRvbS5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKSB8fCBudWxsLFxuICAgICAgYWx0OiBkb20uZ2V0QXR0cmlidXRlKFwiYWx0XCIpIHx8IG51bGxcbiAgICB9KTtcbiAgfSB9KTtcblxuLy8gSW5saW5lIHN0eWxlIHRva2Vuc1xuXG5fbW9kZWwuTGlua01hcmsucmVnaXN0ZXIoXCJwYXJzZURPTVwiLCB7IHRhZzogXCJhXCIsIHBhcnNlOiBmdW5jdGlvbiBwYXJzZShkb20sIHN0YXRlKSB7XG4gICAgdmFyIGhyZWYgPSBkb20uZ2V0QXR0cmlidXRlKFwiaHJlZlwiKTtcbiAgICBpZiAoIWhyZWYpIHJldHVybiBmYWxzZTtcbiAgICBzdGF0ZS53cmFwTWFyayhkb20sIHRoaXMuY3JlYXRlKHsgaHJlZjogaHJlZiwgdGl0bGU6IGRvbS5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKSB9KSk7XG4gIH0gfSk7XG5cbl9tb2RlbC5FbU1hcmsucmVnaXN0ZXIoXCJwYXJzZURPTVwiLCB7IHRhZzogXCJpXCIsIHBhcnNlOiBcIm1hcmtcIiB9KTtcbl9tb2RlbC5FbU1hcmsucmVnaXN0ZXIoXCJwYXJzZURPTVwiLCB7IHRhZzogXCJlbVwiLCBwYXJzZTogXCJtYXJrXCIgfSk7XG5cbl9tb2RlbC5TdHJvbmdNYXJrLnJlZ2lzdGVyKFwicGFyc2VET01cIiwgeyB0YWc6IFwiYlwiLCBwYXJzZTogXCJtYXJrXCIgfSk7XG5fbW9kZWwuU3Ryb25nTWFyay5yZWdpc3RlcihcInBhcnNlRE9NXCIsIHsgdGFnOiBcInN0cm9uZ1wiLCBwYXJzZTogXCJtYXJrXCIgfSk7XG5cbl9tb2RlbC5Db2RlTWFyay5yZWdpc3RlcihcInBhcnNlRE9NXCIsIHsgdGFnOiBcImNvZGVcIiwgcGFyc2U6IFwibWFya1wiIH0pOyIsIi8vICEhIFRoaXMgbW9kdWxlIGltcGxlbWVudHMgYSB3YXkgdG8gcmVnaXN0ZXIgYW5kIGFjY2VzcyBwYXJzZXJzIGZyb21cbi8vIHZhcmlvdXMgaW5wdXQgZm9ybWF0cyB0byBQcm9zZU1pcnJvcidzIFtkb2N1bWVudCBmb3JtYXRdKCNOb2RlKS4gVG9cbi8vIGxvYWQgdGhlIGFjdHVhbCBwYXJzZXJzLCB5b3UgbmVlZCB0byBpbXBvcnQgcGFyc2VyIG1vZHVsZXMgbGlrZVxuLy8gYHBhcnNlL2RvbWAgb3IgYHBhcnNlL21hcmtkb3duYCwgd2hpY2ggd2lsbCB0aGVuIHJlZ2lzdGVyXG4vLyB0aGVtc2VsdmVzIGhlcmUsIGFzIHdlbGwgYXMgZXhwb3J0IHNwZWNpYWwtcHVycG9zZSBwYXJzaW5nXG4vLyBmdW5jdGlvbnMuXG4vL1xuLy8gVGhlc2UgYXJlIHRoZSBwYXJzZXMgaW4gdGhlIGRpc3RyaWJ1dGlvbjpcbi8vXG4vLyAqKmBcImpzb25cImAqKlxuLy8gICA6IFRoZSB0b3AtbGV2ZWwgbW9kdWxlIGRlZmluZXMgYSBzaW5nbGUgcGFyc2VyIGBcImpzb25cImAsIHdoaWNoXG4vLyAgICAgdXNlcyBgTm9kZS5mcm9tSlNPTmAgdG8gcGFyc2UgSlNPTiBkYXRhLlxuLy9cbi8vICoqYFwiZG9tXCJgKipcbi8vICAgOiBQYXJzZXMgW0RPTVxuLy8gICAgIG5vZGVzXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTm9kZSkuXG4vLyAgICAgRGVmaW5lZCBpbiBgcGFyc2UvZG9tYC4gU2VlIGBmcm9tRE9NYC5cbi8vXG4vLyAqKmBcImh0bWxcImAqKlxuLy8gICA6IFBhcnNlcyBzdHJpbmdzIG9mIEhUTUwgY29udGVudC4gRGVmaW5lZCBpbiBgcGFyc2UvZG9tYC5cbi8vXG4vLyAqKmBcIm1hcmtkb3duXCJgKipcbi8vICAgOiBQYXJzZXMgc3RyaW5ncyBvZlxuLy8gICAgIFtDb21tb25NYXJrXShodHRwOi8vY29tbW9ubWFyay5vcmcvKS1mb3JtYXR0ZWQgdGV4dC4gRGVmaW5lZCBpblxuLy8gICAgIGBwYXJzZS9tYXJrZG93bmAuIFNlZSBgZnJvbU1hcmtkb3duYC5cbi8vXG4vLyAqKmBcInRleHRcImAqKlxuLy8gICA6IFNpbXBseSBzcGxpdHMgYSBzdHJpbmcgb2YgdGV4dCBvbiBibGFuayBsaW5lcyBhbmQgY3JlYXRlcyBhXG4vLyAgICAgZG9jdW1lbnQgY29udGFpbmluZyB0aG9zZSBsaW5lcyBhcyBwYXJhZ3JhcGhzLiBEZWZpbmVkIGluXG4vLyAgICAgYHBhcnNlL3RleHRgLiBTZWUgYGZyb21UZXh0YC5cblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLnBhcnNlRnJvbSA9IHBhcnNlRnJvbTtcbmV4cG9ydHMua25vd25Tb3VyY2UgPSBrbm93blNvdXJjZTtcbmV4cG9ydHMuZGVmaW5lU291cmNlID0gZGVmaW5lU291cmNlO1xudmFyIHBhcnNlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4vLyA6OiAoU2NoZW1hLCBhbnksIHN0cmluZywgP09iamVjdCkg4oaSIE5vZGVcbi8vIFBhcnNlIGRvY3VtZW50IGB2YWx1ZWAgZnJvbSB0aGUgZm9ybWF0IG5hbWVkIGJ5IGBmb3JtYXRgLiBJZlxuLy8gYG9wdGlvbnNgIGlzIGdpdmVuLCBpdCBpcyBwYXNzZWQgYWxvbmcgdG8gdGhlIHBhcnNlciBmdW5jdGlvbi5cblxuZnVuY3Rpb24gcGFyc2VGcm9tKHNjaGVtYSwgdmFsdWUsIGZvcm1hdCwgb3B0aW9ucykge1xuICB2YXIgY29udmVydGVyID0gcGFyc2Vyc1tmb3JtYXRdO1xuICBpZiAoIWNvbnZlcnRlcikgdGhyb3cgbmV3IEVycm9yKFwiU291cmNlIGZvcm1hdCBcIiArIGZvcm1hdCArIFwiIG5vdCBkZWZpbmVkXCIpO1xuICByZXR1cm4gY29udmVydGVyKHNjaGVtYSwgdmFsdWUsIG9wdGlvbnMpO1xufVxuXG4vLyA6OiAoc3RyaW5nKSDihpIgYm9vbFxuLy8gUXVlcnkgd2hldGhlciBhIHBhcnNlciBmb3IgdGhlIG5hbWVkIGZvcm1hdCBoYXMgYmVlbiByZWdpc3RlcmVkLlxuXG5mdW5jdGlvbiBrbm93blNvdXJjZShmb3JtYXQpIHtcbiAgcmV0dXJuICEhcGFyc2Vyc1tmb3JtYXRdO1xufVxuXG4vLyA6OiAoc3RyaW5nLCAoU2NoZW1hLCBhbnksID9PYmplY3QpIOKGkiBOb2RlKVxuLy8gUmVnaXN0ZXIgYSBwYXJzZXIgZnVuY3Rpb24gZm9yIGBmb3JtYXRgLlxuXG5mdW5jdGlvbiBkZWZpbmVTb3VyY2UoZm9ybWF0LCBmdW5jKSB7XG4gIHBhcnNlcnNbZm9ybWF0XSA9IGZ1bmM7XG59XG5cbmRlZmluZVNvdXJjZShcImpzb25cIiwgZnVuY3Rpb24gKHNjaGVtYSwganNvbikge1xuICByZXR1cm4gc2NoZW1hLm5vZGVGcm9tSlNPTihqc29uKTtcbn0pOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5mcm9tVGV4dCA9IGZyb21UZXh0O1xuXG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vaW5kZXhcIik7XG5cbi8vIEZJWE1FIGlzIGl0IG1lYW5pbmdmdWwgdG8gdHJ5IGFuZCBhdHRhY2ggdGV4dC1wYXJzaW5nIGluZm9ybWF0aW9uXG4vLyB0byBub2RlIHR5cGVzP1xuXG4vLyA6OiAoU2NoZW1hLCBzdHJpbmcpIOKGkiBOb2RlXG4vLyBDb252ZXJ0IGEgc3RyaW5nIGludG8gYSBzaW1wbGUgUHJvc2VNaXJyb3IgZG9jdW1lbnQuXG5cbmZ1bmN0aW9uIGZyb21UZXh0KHNjaGVtYSwgdGV4dCkge1xuICB2YXIgYmxvY2tzID0gdGV4dC50cmltKCkuc3BsaXQoL1xcbnsyLH0vKTtcbiAgdmFyIG5vZGVzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYmxvY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNwYW5zID0gW107XG4gICAgdmFyIHBhcnRzID0gYmxvY2tzW2ldLnNwbGl0KFwiXFxuXCIpO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgcGFydHMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGlmIChqKSBzcGFucy5wdXNoKHNjaGVtYS5ub2RlKFwiaGFyZF9icmVha1wiKSk7XG4gICAgICBpZiAocGFydHNbal0pIHNwYW5zLnB1c2goc2NoZW1hLnRleHQocGFydHNbal0pKTtcbiAgICB9XG4gICAgbm9kZXMucHVzaChzY2hlbWEubm9kZShcInBhcmFncmFwaFwiLCBudWxsLCBzcGFucykpO1xuICB9XG4gIGlmICghbm9kZXMubGVuZ3RoKSBub2Rlcy5wdXNoKHNjaGVtYS5ub2RlKFwicGFyYWdyYXBoXCIpKTtcbiAgcmV0dXJuIHNjaGVtYS5ub2RlKFwiZG9jXCIsIG51bGwsIG5vZGVzKTtcbn1cblxuKDAsIF9pbmRleC5kZWZpbmVTb3VyY2UpKFwidGV4dFwiLCBmcm9tVGV4dCk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZXhwb3J0cy50b0RPTSA9IHRvRE9NO1xuZXhwb3J0cy5yZW5kZXJOb2RlVG9ET00gPSByZW5kZXJOb2RlVG9ET007XG5leHBvcnRzLnRvSFRNTCA9IHRvSFRNTDtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIF9tb2RlbCA9IHJlcXVpcmUoXCIuLi9tb2RlbFwiKTtcblxudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2luZGV4XCIpO1xuXG4vLyA7OyAjdG9jPWZhbHNlIE9iamVjdCB1c2VkIHRvIHRvIGV4cG9zZSByZWxldmFudCB2YWx1ZXMgYW5kIG1ldGhvZHNcbi8vIHRvIERPTSBzZXJpYWxpemVyIGZ1bmN0aW9ucy5cblxudmFyIERPTVNlcmlhbGl6ZXIgPSAoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBET01TZXJpYWxpemVyKG9wdGlvbnMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRE9NU2VyaWFsaXplcik7XG5cbiAgICAvLyA6OiBPYmplY3QgVGhlIG9wdGlvbnMgcGFzc2VkIHRvIHRoZSBzZXJpYWxpemVyLlxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgLy8gOjogRE9NRG9jdW1lbnQgVGhlIERPTSBkb2N1bWVudCBpbiB3aGljaCB3ZSBhcmUgd29ya2luZy5cbiAgICB0aGlzLmRvYyA9IHRoaXMub3B0aW9ucy5kb2N1bWVudCB8fCB3aW5kb3cuZG9jdW1lbnQ7XG4gIH1cblxuICAvLyA6OiAoTm9kZSwgP09iamVjdCkg4oaSIERPTUZyYWdtZW50XG4gIC8vIFNlcmlhbGl6ZSB0aGUgY29udGVudCBvZiB0aGUgZ2l2ZW4gbm9kZSB0byBhIERPTSBmcmFnbWVudC4gV2hlbiBub3RcbiAgLy8gaW4gdGhlIGJyb3dzZXIsIHRoZSBgZG9jdW1lbnRgIG9wdGlvbiwgY29udGFpbmluZyBhIERPTSBkb2N1bWVudCxcbiAgLy8gc2hvdWxkIGJlIHBhc3NlZCBzbyB0aGF0IHRoZSBzZXJpYWxpemUgY2FuIGNyZWF0ZSBub2Rlcy5cbiAgLy9cbiAgLy8gVG8gZGVmaW5lIHJlbmRlcmluZyBiZWhhdmlvciBmb3IgeW91ciBvd24gW25vZGVdKCNOb2RlVHlwZSkgYW5kXG4gIC8vIFttYXJrXSgjTWFya1R5cGUpIHR5cGVzLCBnaXZlIHRoZW0gYSBgc2VyaWFsaXplRE9NYCBtZXRob2QuIFRoaXNcbiAgLy8gbWV0aG9kIGlzIHBhc3NlZCBhIGBOb2RlYCBhbmQgYSBgRE9NU2VyaWFsaXplcmAsIGFuZCBzaG91bGQgcmV0dXJuXG4gIC8vIHRoZSBbRE9NXG4gIC8vIG5vZGVdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Ob2RlKSB0aGF0XG4gIC8vIHJlcHJlc2VudHMgdGhpcyBub2RlIGFuZCBpdHMgY29udGVudC4gRm9yIG1hcmtzLCB0aGF0IHNob3VsZCBiZSBhblxuICAvLyBpbmxpbmUgd3JhcHBpbmcgbm9kZSBsaWtlIGA8YT5gIG9yIGA8c3Ryb25nPmAuXG4gIC8vXG4gIC8vIEluZGl2aWR1YWwgYXR0cmlidXRlcyBjYW4gYWxzbyBkZWZpbmUgc2VyaWFsaXphdGlvbiBiZWhhdmlvci4gSWYgYW5cbiAgLy8gYEF0dHJpYnV0ZWAgb2JqZWN0IGhhcyBhIGBzZXJpYWxpemVET01gIG1ldGhvZCwgdGhhdCB3aWxsIGJlIGNhbGxlZFxuICAvLyB3aXRoIHRoZSBET00gbm9kZSByZXByZXNlbnRpbmcgdGhlIG5vZGUgdGhhdCB0aGUgYXR0cmlidXRlIGFwcGxpZXNcbiAgLy8gdG8gYW5kIHRoZSBhdHR0cmlidXRlJ3MgdmFsdWUsIHNvIHRoYXQgaXQgY2FuIHNldCBhZGRpdGlvbmFsIERPTVxuICAvLyBhdHRyaWJ1dGVzIG9uIHRoZSBET00gbm9kZS5cblxuICAvLyA6OiAoc3RyaW5nLCA/T2JqZWN0LCAuLi51bmlvbjxzdHJpbmcsIERPTU5vZGU+KSDihpIgRE9NTm9kZVxuICAvLyBDcmVhdGUgYSBET00gbm9kZSBvZiB0aGUgZ2l2ZW4gdHlwZSwgd2l0aCAob3B0aW9uYWxseSkgdGhlIGdpdmVuXG4gIC8vIGF0dHJpYnV0ZXMgYW5kIGNvbnRlbnQuIENvbnRlbnQgZWxlbWVudHMgbWF5IGJlIHN0cmluZ3MgKGZvciB0ZXh0XG4gIC8vIG5vZGVzKSBvciBvdGhlciBET00gbm9kZXMuXG5cbiAgX2NyZWF0ZUNsYXNzKERPTVNlcmlhbGl6ZXIsIFt7XG4gICAga2V5OiBcImVsdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlbHQodHlwZSwgYXR0cnMpIHtcbiAgICAgIHZhciByZXN1bHQgPSB0aGlzLmRvYy5jcmVhdGVFbGVtZW50KHR5cGUpO1xuICAgICAgaWYgKGF0dHJzKSBmb3IgKHZhciBfbmFtZSBpbiBhdHRycykge1xuICAgICAgICBpZiAoX25hbWUgPT0gXCJzdHlsZVwiKSByZXN1bHQuc3R5bGUuY3NzVGV4dCA9IGF0dHJzW19uYW1lXTtlbHNlIGlmIChhdHRyc1tfbmFtZV0pIHJlc3VsdC5zZXRBdHRyaWJ1dGUoX25hbWUsIGF0dHJzW19uYW1lXSk7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBjb250ZW50ID0gQXJyYXkoX2xlbiA+IDIgPyBfbGVuIC0gMiA6IDApLCBfa2V5ID0gMjsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBjb250ZW50W19rZXkgLSAyXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb250ZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlc3VsdC5hcHBlbmRDaGlsZCh0eXBlb2YgY29udGVudFtpXSA9PSBcInN0cmluZ1wiID8gdGhpcy5kb2MuY3JlYXRlVGV4dE5vZGUoY29udGVudFtpXSkgOiBjb250ZW50W2ldKTtcbiAgICAgIH1yZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJOb2RlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlck5vZGUobm9kZSwgb2Zmc2V0KSB7XG4gICAgICB2YXIgZG9tID0gbm9kZS50eXBlLnNlcmlhbGl6ZURPTShub2RlLCB0aGlzKTtcbiAgICAgIGZvciAodmFyIGF0dHIgaW4gbm9kZS50eXBlLmF0dHJzKSB7XG4gICAgICAgIHZhciBkZXNjID0gbm9kZS50eXBlLmF0dHJzW2F0dHJdO1xuICAgICAgICBpZiAoZGVzYy5zZXJpYWxpemVET00pIGRlc2Muc2VyaWFsaXplRE9NKGRvbSwgbm9kZS5hdHRyc1thdHRyXSwgdGhpcywgbm9kZSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9uUmVuZGVyKSBkb20gPSB0aGlzLm9wdGlvbnMub25SZW5kZXIobm9kZSwgZG9tLCBvZmZzZXQpIHx8IGRvbTtcbiAgICAgIHJldHVybiBkb207XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlckNvbnRlbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyQ29udGVudChub2RlLCB3aGVyZSkge1xuICAgICAgaWYgKCF3aGVyZSkgd2hlcmUgPSB0aGlzLmRvYy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgICBpZiAoIW5vZGUuaXNUZXh0YmxvY2spIHRoaXMucmVuZGVyQmxvY2tzSW50byhub2RlLCB3aGVyZSk7ZWxzZSBpZiAodGhpcy5vcHRpb25zLnJlbmRlcklubGluZUZsYXQpIHRoaXMucmVuZGVySW5saW5lRmxhdEludG8obm9kZSwgd2hlcmUpO2Vsc2UgdGhpcy5yZW5kZXJJbmxpbmVJbnRvKG5vZGUsIHdoZXJlKTtcbiAgICAgIHJldHVybiB3aGVyZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyQmxvY2tzSW50b1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJCbG9ja3NJbnRvKHBhcmVudCwgd2hlcmUpIHtcbiAgICAgIGZvciAodmFyIGkgPSBwYXJlbnQuaXRlcigpLCBjaGlsZCA9IHVuZGVmaW5lZDsgY2hpbGQgPSBpLm5leHQoKS52YWx1ZTspIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5wYXRoKSB0aGlzLm9wdGlvbnMucGF0aC5wdXNoKGkub2Zmc2V0IC0gY2hpbGQud2lkdGgpO1xuICAgICAgICB3aGVyZS5hcHBlbmRDaGlsZCh0aGlzLnJlbmRlck5vZGUoY2hpbGQsIGkub2Zmc2V0IC0gY2hpbGQud2lkdGgpKTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5wYXRoKSB0aGlzLm9wdGlvbnMucGF0aC5wb3AoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVySW5saW5lSW50b1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJJbmxpbmVJbnRvKHBhcmVudCwgd2hlcmUpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHZhciB0b3AgPSB3aGVyZTtcbiAgICAgIHZhciBhY3RpdmUgPSBbXTtcbiAgICAgIHBhcmVudC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlLCBvZmZzZXQpIHtcbiAgICAgICAgdmFyIGtlZXAgPSAwO1xuICAgICAgICBmb3IgKDsga2VlcCA8IE1hdGgubWluKGFjdGl2ZS5sZW5ndGgsIG5vZGUubWFya3MubGVuZ3RoKTsgKytrZWVwKSBpZiAoIW5vZGUubWFya3Nba2VlcF0uZXEoYWN0aXZlW2tlZXBdKSkgYnJlYWs7XG4gICAgICAgIHdoaWxlIChrZWVwIDwgYWN0aXZlLmxlbmd0aCkge1xuICAgICAgICAgIGFjdGl2ZS5wb3AoKTtcbiAgICAgICAgICB0b3AgPSB0b3AucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoYWN0aXZlLmxlbmd0aCA8IG5vZGUubWFya3MubGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIGFkZCA9IG5vZGUubWFya3NbYWN0aXZlLmxlbmd0aF07XG4gICAgICAgICAgYWN0aXZlLnB1c2goYWRkKTtcbiAgICAgICAgICB0b3AgPSB0b3AuYXBwZW5kQ2hpbGQoX3RoaXMucmVuZGVyTWFyayhhZGQpKTtcbiAgICAgICAgfVxuICAgICAgICB0b3AuYXBwZW5kQ2hpbGQoX3RoaXMucmVuZGVyTm9kZShub2RlLCBvZmZzZXQpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJJbmxpbmVGbGF0SW50b1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJJbmxpbmVGbGF0SW50byhwYXJlbnQsIHdoZXJlKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgcGFyZW50LmZvckVhY2goZnVuY3Rpb24gKG5vZGUsIHN0YXJ0KSB7XG4gICAgICAgIHZhciBkb20gPSBfdGhpczIucmVuZGVyTm9kZShub2RlLCBzdGFydCk7XG4gICAgICAgIGRvbSA9IF90aGlzMi53cmFwSW5saW5lRmxhdChkb20sIG5vZGUubWFya3MpO1xuICAgICAgICBkb20gPSBfdGhpczIub3B0aW9ucy5yZW5kZXJJbmxpbmVGbGF0KG5vZGUsIGRvbSwgc3RhcnQpIHx8IGRvbTtcbiAgICAgICAgd2hlcmUuYXBwZW5kQ2hpbGQoZG9tKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJNYXJrXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlck1hcmsobWFyaykge1xuICAgICAgdmFyIGRvbSA9IG1hcmsudHlwZS5zZXJpYWxpemVET00obWFyaywgdGhpcyk7XG4gICAgICBmb3IgKHZhciBhdHRyIGluIG1hcmsudHlwZS5hdHRycykge1xuICAgICAgICB2YXIgZGVzYyA9IG1hcmsudHlwZS5hdHRyc1thdHRyXTtcbiAgICAgICAgaWYgKGRlc2Muc2VyaWFsaXplRE9NKSBkZXNjLnNlcmlhbGl6ZURPTShkb20sIG1hcmsuYXR0cnNbYXR0cl0sIHRoaXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRvbTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwid3JhcElubGluZUZsYXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gd3JhcElubGluZUZsYXQoZG9tLCBtYXJrcykge1xuICAgICAgZm9yICh2YXIgaSA9IG1hcmtzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIHZhciB3cmFwID0gdGhpcy5yZW5kZXJNYXJrKG1hcmtzW2ldKTtcbiAgICAgICAgd3JhcC5hcHBlbmRDaGlsZChkb20pO1xuICAgICAgICBkb20gPSB3cmFwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRvbTtcbiAgICB9XG5cbiAgICAvLyA6OiAoTm9kZSwgc3RyaW5nLCA/T2JqZWN0KSDihpIgRE9NTm9kZVxuICAgIC8vIFJlbmRlciB0aGUgY29udGVudCBvZiBQcm9zZU1pcnJvciBub2RlIGludG8gYSBET00gbm9kZSB3aXRoIHRoZVxuICAgIC8vIGdpdmVuIHRhZyBuYW1lIGFuZCBhdHRyaWJ1dGVzLlxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlckFzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlckFzKG5vZGUsIHRhZ05hbWUsIHRhZ0F0dHJzKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXJDb250ZW50KG5vZGUsIHRoaXMuZWx0KHRhZ05hbWUsIHRhZ0F0dHJzKSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIERPTVNlcmlhbGl6ZXI7XG59KSgpO1xuXG5mdW5jdGlvbiB0b0RPTShub2RlKSB7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMV07XG5cbiAgcmV0dXJuIG5ldyBET01TZXJpYWxpemVyKG9wdGlvbnMpLnJlbmRlckNvbnRlbnQobm9kZSk7XG59XG5cbigwLCBfaW5kZXguZGVmaW5lVGFyZ2V0KShcImRvbVwiLCB0b0RPTSk7XG5cbi8vIDo6IChOb2RlLCA/T2JqZWN0KSDihpIgRE9NTm9kZVxuLy8gU2VyaWFsaXplIGEgZ2l2ZW4gbm9kZSB0byBhIERPTSBub2RlLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHlvdSBuZWVkXG4vLyB0byBzZXJpYWxpemUgYSBwYXJ0IG9mIGEgZG9jdW1lbnQsIGFzIG9wcG9zZWQgdG8gdGhlIHdob2xlXG4vLyBkb2N1bWVudC5cblxuZnVuY3Rpb24gcmVuZGVyTm9kZVRvRE9NKG5vZGUsIG9wdGlvbnMsIG9mZnNldCkge1xuICB2YXIgc2VyaWFsaXplciA9IG5ldyBET01TZXJpYWxpemVyKG9wdGlvbnMpO1xuICB2YXIgZG9tID0gc2VyaWFsaXplci5yZW5kZXJOb2RlKG5vZGUsIG9mZnNldCk7XG4gIGlmIChub2RlLmlzSW5saW5lKSB7XG4gICAgZG9tID0gc2VyaWFsaXplci53cmFwSW5saW5lRmxhdChkb20sIG5vZGUubWFya3MpO1xuICAgIGlmIChzZXJpYWxpemVyLm9wdGlvbnMucmVuZGVySW5saW5lRmxhdCkgZG9tID0gb3B0aW9ucy5yZW5kZXJJbmxpbmVGbGF0KG5vZGUsIGRvbSwgb2Zmc2V0KSB8fCBkb207XG4gIH1cbiAgcmV0dXJuIGRvbTtcbn1cblxuLy8gOjogKE5vZGUsID9PYmplY3QpIOKGkiBzdHJpbmdcbi8vIFNlcmlhbGl6ZSBhIG5vZGUgYXMgYW4gSFRNTCBzdHJpbmcuIEdvZXMgdGhyb3VnaCBgdG9ET01gIGFuZCB0aGVuXG4vLyBzZXJpYWxpemVzIHRoZSByZXN1bHQuIEFnYWluLCB5b3UgbXVzdCBwYXNzIGEgYGRvY3VtZW50YCBvcHRpb25cbi8vIHdoZW4gbm90IGluIHRoZSBicm93c2VyLlxuXG5mdW5jdGlvbiB0b0hUTUwobm9kZSwgb3B0aW9ucykge1xuICB2YXIgc2VyaWFsaXplciA9IG5ldyBET01TZXJpYWxpemVyKG9wdGlvbnMpO1xuICB2YXIgd3JhcCA9IHNlcmlhbGl6ZXIuZWx0KFwiZGl2XCIpO1xuICB3cmFwLmFwcGVuZENoaWxkKHNlcmlhbGl6ZXIucmVuZGVyQ29udGVudChub2RlKSk7XG4gIHJldHVybiB3cmFwLmlubmVySFRNTDtcbn1cblxuKDAsIF9pbmRleC5kZWZpbmVUYXJnZXQpKFwiaHRtbFwiLCB0b0hUTUwpO1xuXG4vLyBCbG9jayBub2Rlc1xuXG5mdW5jdGlvbiBkZWYoY2xzLCBtZXRob2QpIHtcbiAgY2xzLnByb3RvdHlwZS5zZXJpYWxpemVET00gPSBtZXRob2Q7XG59XG5cbmRlZihfbW9kZWwuQmxvY2tRdW90ZSwgZnVuY3Rpb24gKG5vZGUsIHMpIHtcbiAgcmV0dXJuIHMucmVuZGVyQXMobm9kZSwgXCJibG9ja3F1b3RlXCIpO1xufSk7XG5cbl9tb2RlbC5CbG9ja1F1b3RlLnByb3RvdHlwZS5jb3VudENvb3Jkc0FzQ2hpbGQgPSBmdW5jdGlvbiAoXywgcGF0aCwgZG9tLCBjb29yZHMpIHtcbiAgdmFyIGNoaWxkQm94ID0gZG9tLmZpcnN0Q2hpbGQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIGlmIChjb29yZHMubGVmdCA8IGNoaWxkQm94LmxlZnQgLSAyKSByZXR1cm4gX21vZGVsLlBvcy5mcm9tKHBhdGgpO1xufTtcblxuZGVmKF9tb2RlbC5CdWxsZXRMaXN0LCBmdW5jdGlvbiAobm9kZSwgcykge1xuICByZXR1cm4gcy5yZW5kZXJBcyhub2RlLCBcInVsXCIpO1xufSk7XG5cbmRlZihfbW9kZWwuT3JkZXJlZExpc3QsIGZ1bmN0aW9uIChub2RlLCBzKSB7XG4gIHJldHVybiBzLnJlbmRlckFzKG5vZGUsIFwib2xcIiwgeyBzdGFydDogbm9kZS5hdHRycy5vcmRlciAhPSBcIjFcIiAmJiBub2RlLmF0dHJzLm9yZGVyIH0pO1xufSk7XG5cbl9tb2RlbC5PcmRlcmVkTGlzdC5wcm90b3R5cGUuY291bnRDb29yZHNBc0NoaWxkID0gX21vZGVsLkJ1bGxldExpc3QucHJvdG90eXBlLmNvdW50Q29vcmRzQXNDaGlsZCA9IGZ1bmN0aW9uIChfLCBwYXRoLCBkb20sIGNvb3Jkcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGRvbS5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGNoaWxkID0gZG9tLmNoaWxkTm9kZXNbaV07XG4gICAgaWYgKCFjaGlsZC5oYXNBdHRyaWJ1dGUoXCJwbS1vZmZzZXRcIikpIGNvbnRpbnVlO1xuICAgIHZhciBjaGlsZEJveCA9IGNoaWxkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGlmIChjb29yZHMubGVmdCA+IGNoaWxkQm94LmxlZnQgLSAyKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoY2hpbGRCb3gudG9wIDw9IGNvb3Jkcy50b3AgJiYgY2hpbGRCb3guYm90dG9tID49IGNvb3Jkcy50b3ApIHJldHVybiBuZXcgX21vZGVsLlBvcyhwYXRoLCBpKTtcbiAgfVxufTtcblxuZGVmKF9tb2RlbC5MaXN0SXRlbSwgZnVuY3Rpb24gKG5vZGUsIHMpIHtcbiAgcmV0dXJuIHMucmVuZGVyQXMobm9kZSwgXCJsaVwiKTtcbn0pO1xuXG5kZWYoX21vZGVsLkhvcml6b250YWxSdWxlLCBmdW5jdGlvbiAoXywgcykge1xuICByZXR1cm4gcy5lbHQoXCJoclwiKTtcbn0pO1xuXG5kZWYoX21vZGVsLlBhcmFncmFwaCwgZnVuY3Rpb24gKG5vZGUsIHMpIHtcbiAgcmV0dXJuIHMucmVuZGVyQXMobm9kZSwgXCJwXCIpO1xufSk7XG5cbmRlZihfbW9kZWwuSGVhZGluZywgZnVuY3Rpb24gKG5vZGUsIHMpIHtcbiAgcmV0dXJuIHMucmVuZGVyQXMobm9kZSwgXCJoXCIgKyBub2RlLmF0dHJzLmxldmVsKTtcbn0pO1xuXG5kZWYoX21vZGVsLkNvZGVCbG9jaywgZnVuY3Rpb24gKG5vZGUsIHMpIHtcbiAgdmFyIGNvZGUgPSBzLnJlbmRlckFzKG5vZGUsIFwiY29kZVwiKTtcbiAgaWYgKG5vZGUuYXR0cnMucGFyYW1zICE9IG51bGwpIGNvZGUuY2xhc3NOYW1lID0gXCJmZW5jZSBcIiArIG5vZGUuYXR0cnMucGFyYW1zLnJlcGxhY2UoLyhefFxccyspL2csIFwiJCZsYW5nLVwiKTtcbiAgcmV0dXJuIHMuZWx0KFwicHJlXCIsIG51bGwsIGNvZGUpO1xufSk7XG5cbi8vIElubGluZSBjb250ZW50XG5cbmRlZihfbW9kZWwuVGV4dCwgZnVuY3Rpb24gKG5vZGUsIHMpIHtcbiAgcmV0dXJuIHMuZG9jLmNyZWF0ZVRleHROb2RlKG5vZGUudGV4dCk7XG59KTtcblxuZGVmKF9tb2RlbC5JbWFnZSwgZnVuY3Rpb24gKG5vZGUsIHMpIHtcbiAgcmV0dXJuIHMuZWx0KFwiaW1nXCIsIHtcbiAgICBzcmM6IG5vZGUuYXR0cnMuc3JjLFxuICAgIGFsdDogbm9kZS5hdHRycy5hbHQsXG4gICAgdGl0bGU6IG5vZGUuYXR0cnMudGl0bGVcbiAgfSk7XG59KTtcblxuZGVmKF9tb2RlbC5IYXJkQnJlYWssIGZ1bmN0aW9uIChfLCBzKSB7XG4gIHJldHVybiBzLmVsdChcImJyXCIpO1xufSk7XG5cbi8vIElubGluZSBzdHlsZXNcblxuZGVmKF9tb2RlbC5FbU1hcmssIGZ1bmN0aW9uIChfLCBzKSB7XG4gIHJldHVybiBzLmVsdChcImVtXCIpO1xufSk7XG5cbmRlZihfbW9kZWwuU3Ryb25nTWFyaywgZnVuY3Rpb24gKF8sIHMpIHtcbiAgcmV0dXJuIHMuZWx0KFwic3Ryb25nXCIpO1xufSk7XG5cbmRlZihfbW9kZWwuQ29kZU1hcmssIGZ1bmN0aW9uIChfLCBzKSB7XG4gIHJldHVybiBzLmVsdChcImNvZGVcIik7XG59KTtcblxuZGVmKF9tb2RlbC5MaW5rTWFyaywgZnVuY3Rpb24gKG1hcmssIHMpIHtcbiAgcmV0dXJuIHMuZWx0KFwiYVwiLCB7IGhyZWY6IG1hcmsuYXR0cnMuaHJlZixcbiAgICB0aXRsZTogbWFyay5hdHRycy50aXRsZSB9KTtcbn0pOyIsIi8vICEhIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgd2F5IHRvIHJlZ2lzdGVyIGFuZCBhY2Nlc3MgZnVuY3Rpb25zIHRoYXRcbi8vIHNlcmlhbGl6ZSBQcm9zZU1pcnJvciBbZG9jdW1lbnRzXSgjTm9kZSkgdG8gdmFyaW91cyBmb3JtYXRzLiBUb1xuLy8gbG9hZCB0aGUgYWN0dWFsIHNlcmlhbGl6ZXJzLCB5b3UgbmVlZCB0byBpbmNsdWRlIHN1Ym1vZHVsZXMgb2YgdGhpc1xuLy8gbW9kdWxlIChvciAzcmQgcGFydHkgc2VyaWFsaXphdGlvbiBtb2R1bGVzKSwgd2hpY2ggd2lsbCByZWdpc3RlclxuLy8gdGhlbXNlbHZlcyB0byB0aGlzIG1vZHVsZS5cbi8vXG4vLyBUaGVzZSBhcmUgdGhlIHNlcmlhbGl6ZXJzIGRlZmluZWQ6XG4vL1xuLy8gKipgXCJqc29uXCJgKipcbi8vICAgOiBVc2UgYE5vZGUudG9KU09OYCB0byBzZXJpYWxpemUgdGhlIG5vZGUgYXMgSlNPTi4gRGVmaW5lZCBieSB0aGVcbi8vICAgICB0b3AtbGV2ZWwgYHNlcmlhbGl6ZWAgbW9kdWxlLlxuLy9cbi8vICoqYFwiZG9tXCJgKipcbi8vICAgOiBTZXJpYWxpemUgdG8gYSBbRE9NXG4vLyAgICAgZnJhZ21lbnRdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Eb2N1bWVudEZyYWdtZW50KS5cbi8vICAgICBEZWZpbmVkIGluIGBzZXJpYWxpemUvZG9tYC4gU2VlIGB0b0RPTWAuXG4vL1xuLy8gKipgXCJodG1sXCJgKipcbi8vICAgOiBTZXJpYWxpemUgdG8gSFRNTCB0ZXh0LiBEZWZpbmVkIGluIGBzZXJpYWxpemUvZG9tYC4gU2VlIGB0b0hUTUxgLlxuLy9cbi8vICoqYFwibWFya2Rvd25cImAqKlxuLy8gICA6IFNlcmlhbGl6ZSB0byBbQ29tbW9uTWFya10oaHR0cDovL2NvbW1vbm1hcmsub3JnLykgbWFya2VkLXVwXG4vLyAgICAgdGV4dC4gRGVmaW5lZCBpbiBgc2VyaWFsaXplL21hcmtkb3duYC4gU2VlIGB0b01hcmtkb3duYC5cbi8vXG4vLyAqKmBcInRleHRcImAqKlxuLy8gICA6IFNlcmlhbGl6ZSB0byBwbGFpbiB0ZXh0LiBEZWZpbmVkIGluIGBzZXJpYWxpemUvdGV4dGAuIFNlZSBgdG9UZXh0YC5cblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLnNlcmlhbGl6ZVRvID0gc2VyaWFsaXplVG87XG5leHBvcnRzLmtub3duVGFyZ2V0ID0ga25vd25UYXJnZXQ7XG5leHBvcnRzLmRlZmluZVRhcmdldCA9IGRlZmluZVRhcmdldDtcbnZhciBzZXJpYWxpemVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbi8vIDo6IChOb2RlLCBzdHJpbmcsID9PYmplY3QpIOKGkiBhbnlcbi8vIFNlcmlhbGl6ZSB0aGUgZ2l2ZW4gZG9jdW1lbnQgdG8gdGhlIGdpdmVuIGZvcm1hdC4gSWYgYG9wdGlvbnNgIGlzXG4vLyBnaXZlbiwgaXQgd2lsbCBiZSBwYXNzZWQgYWxvbmcgdG8gdGhlIHNlcmlhbGl6ZXIgZnVuY3Rpb24uXG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZVRvKGRvYywgZm9ybWF0LCBvcHRpb25zKSB7XG4gIHZhciBjb252ZXJ0ZXIgPSBzZXJpYWxpemVyc1tmb3JtYXRdO1xuICBpZiAoIWNvbnZlcnRlcikgdGhyb3cgbmV3IEVycm9yKFwiVGFyZ2V0IGZvcm1hdCBcIiArIGZvcm1hdCArIFwiIG5vdCBkZWZpbmVkXCIpO1xuICByZXR1cm4gY29udmVydGVyKGRvYywgb3B0aW9ucyk7XG59XG5cbi8vIDo6IChzdHJpbmcpIOKGkiBib29sXG4vLyBRdWVyeSB3aGV0aGVyIGEgZ2l2ZW4gc2VyaWFsaXphdGlvbiBmb3JtYXQgaGFzIGJlZW4gcmVnaXN0ZXJlZC5cblxuZnVuY3Rpb24ga25vd25UYXJnZXQoZm9ybWF0KSB7XG4gIHJldHVybiAhIXNlcmlhbGl6ZXJzW2Zvcm1hdF07XG59XG5cbi8vIDo6IChzdHJpbmcsIChOb2RlLCA/T2JqZWN0KSDihpIgYW55KVxuLy8gUmVnaXN0ZXIgYSBmdW5jdGlvbiBhcyB0aGUgc2VyaWFsaXplciBmb3IgYGZvcm1hdGAuXG5cbmZ1bmN0aW9uIGRlZmluZVRhcmdldChmb3JtYXQsIGZ1bmMpIHtcbiAgc2VyaWFsaXplcnNbZm9ybWF0XSA9IGZ1bmM7XG59XG5cbmRlZmluZVRhcmdldChcImpzb25cIiwgZnVuY3Rpb24gKGRvYykge1xuICByZXR1cm4gZG9jLnRvSlNPTigpO1xufSk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLnRvVGV4dCA9IHRvVGV4dDtcblxudmFyIF9tb2RlbCA9IHJlcXVpcmUoXCIuLi9tb2RlbFwiKTtcblxudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2luZGV4XCIpO1xuXG5fbW9kZWwuQmxvY2sucHJvdG90eXBlLnNlcmlhbGl6ZVRleHQgPSBmdW5jdGlvbiAobm9kZSkge1xuICB2YXIgYWNjdW0gPSBcIlwiO1xuICBub2RlLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgcmV0dXJuIGFjY3VtICs9IGNoaWxkLnR5cGUuc2VyaWFsaXplVGV4dChjaGlsZCk7XG4gIH0pO1xuICByZXR1cm4gYWNjdW07XG59O1xuXG5fbW9kZWwuVGV4dGJsb2NrLnByb3RvdHlwZS5zZXJpYWxpemVUZXh0ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgdmFyIHRleHQgPSBfbW9kZWwuQmxvY2sucHJvdG90eXBlLnNlcmlhbGl6ZVRleHQobm9kZSk7XG4gIHJldHVybiB0ZXh0ICYmIHRleHQgKyBcIlxcblxcblwiO1xufTtcblxuX21vZGVsLklubGluZS5wcm90b3R5cGUuc2VyaWFsaXplVGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIFwiXCI7XG59O1xuXG5fbW9kZWwuSGFyZEJyZWFrLnByb3RvdHlwZS5zZXJpYWxpemVUZXh0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gXCJcXG5cIjtcbn07XG5cbl9tb2RlbC5UZXh0LnByb3RvdHlwZS5zZXJpYWxpemVUZXh0ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUudGV4dDtcbn07XG5cbi8vIDo6IChOb2RlKSDihpIgc3RyaW5nXG4vLyBTZXJpYWxpemUgYSBub2RlIGFzIGEgcGxhaW4gdGV4dCBzdHJpbmcuXG5cbmZ1bmN0aW9uIHRvVGV4dChkb2MpIHtcbiAgcmV0dXJuIGRvYy50eXBlLnNlcmlhbGl6ZVRleHQoZG9jKS50cmltKCk7XG59XG5cbigwLCBfaW5kZXguZGVmaW5lVGFyZ2V0KShcInRleHRcIiwgdG9UZXh0KTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuY2FuTGlmdCA9IGNhbkxpZnQ7XG5leHBvcnRzLmNhbldyYXAgPSBjYW5XcmFwO1xuXG52YXIgX21vZGVsID0gcmVxdWlyZShcIi4uL21vZGVsXCIpO1xuXG52YXIgX3RyYW5zZm9ybSA9IHJlcXVpcmUoXCIuL3RyYW5zZm9ybVwiKTtcblxudmFyIF9zdGVwID0gcmVxdWlyZShcIi4vc3RlcFwiKTtcblxudmFyIF90cmVlID0gcmVxdWlyZShcIi4vdHJlZVwiKTtcblxudmFyIF9tYXAgPSByZXF1aXJlKFwiLi9tYXBcIik7XG5cbi8vICEhICoqYGFuY2VzdG9yYCoqXG4vLyAgICA6IENoYW5nZSB0aGUgc3RhY2sgb2Ygbm9kZXMgdGhhdCB3cmFwIHRoZSBwYXJ0IG9mIHRoZSBkb2N1bWVudFxuLy8gICAgICBiZXR3ZWVuIGBmcm9tYCBhbmQgYHRvYCwgd2hpY2ggbXVzdCBwb2ludCBpbnRvIHRoZSBzYW1lIHBhcmVudFxuLy8gICAgICBub2RlLlxuLy9cbi8vICAgICAgVGhlIHNldCBvZiBhbmNlc3RvcnMgdG8gcmVwbGFjZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBgZGVwdGhgXG4vLyAgICAgIHByb3BlcnR5IG9mIHRoZSBzdGVwJ3MgcGFyYW1ldGVyLiBJZiB0aGlzIGlzIGdyZWF0ZXIgdGhhblxuLy8gICAgICB6ZXJvLCBgZnJvbWAgYW5kIGB0b2AgbXVzdCBwb2ludCBhdCB0aGUgc3RhcnQgYW5kIGVuZCBvZiBhXG4vLyAgICAgIHN0YWNrIG9mIG5vZGVzLCBvZiB0aGF0IGRlcHRoLCBzaW5jZSB0aGlzIHN0ZXAgd2lsbCBub3Qgc3BsaXRcbi8vICAgICAgbm9kZXMuXG4vL1xuLy8gICAgICBUaGUgc2V0IG9mIG5ldyBhbmNlc3RvcnMgdG8gd3JhcCB3aXRoIGlzIGRldGVybWluZWQgYnkgdGhlXG4vLyAgICAgIGB0eXBlc2AgYW5kIGBhdHRyc2AgcHJvcGVydGllcyBvZiB0aGUgcGFyYW1ldGVyLiBUaGUgZmlyc3Rcbi8vICAgICAgc2hvdWxkIGJlIGFuIGFycmF5IG9mIGBOb2RlVHlwZWBzLCBhbmQgdGhlIHNlY29uZCwgb3B0aW9uYWxseSxcbi8vICAgICAgYW4gYXJyYXkgb2YgYXR0cmlidXRlIG9iamVjdHMuXG5cbl9zdGVwLlN0ZXAuZGVmaW5lKFwiYW5jZXN0b3JcIiwge1xuICBhcHBseTogZnVuY3Rpb24gYXBwbHkoZG9jLCBzdGVwKSB7XG4gICAgdmFyIGZyb20gPSBzdGVwLmZyb20sXG4gICAgICAgIHRvID0gc3RlcC50bztcbiAgICBpZiAoISgwLCBfdHJlZS5pc0ZsYXRSYW5nZSkoZnJvbSwgdG8pKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgdG9QYXJlbnQgPSBmcm9tLnBhdGgsXG4gICAgICAgIHN0YXJ0ID0gZnJvbS5vZmZzZXQsXG4gICAgICAgIGVuZCA9IHRvLm9mZnNldDtcbiAgICB2YXIgX3N0ZXAkcGFyYW0gPSBzdGVwLnBhcmFtO1xuICAgIHZhciBfc3RlcCRwYXJhbSRkZXB0aCA9IF9zdGVwJHBhcmFtLmRlcHRoO1xuICAgIHZhciBkZXB0aCA9IF9zdGVwJHBhcmFtJGRlcHRoID09PSB1bmRlZmluZWQgPyAwIDogX3N0ZXAkcGFyYW0kZGVwdGg7XG4gICAgdmFyIF9zdGVwJHBhcmFtJHR5cGVzID0gX3N0ZXAkcGFyYW0udHlwZXM7XG4gICAgdmFyIHR5cGVzID0gX3N0ZXAkcGFyYW0kdHlwZXMgPT09IHVuZGVmaW5lZCA/IFtdIDogX3N0ZXAkcGFyYW0kdHlwZXM7XG4gICAgdmFyIF9zdGVwJHBhcmFtJGF0dHJzID0gX3N0ZXAkcGFyYW0uYXR0cnM7XG4gICAgdmFyIGF0dHJzID0gX3N0ZXAkcGFyYW0kYXR0cnMgPT09IHVuZGVmaW5lZCA/IFtdIDogX3N0ZXAkcGFyYW0kYXR0cnM7XG5cbiAgICB2YXIgaW5uZXIgPSBkb2MucGF0aChmcm9tLnBhdGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVwdGg7IGkrKykge1xuICAgICAgaWYgKHN0YXJ0ID4gMCB8fCBlbmQgPCBkb2MucGF0aCh0b1BhcmVudCkuc2l6ZSB8fCB0b1BhcmVudC5sZW5ndGggPT0gMCkgcmV0dXJuIG51bGw7XG4gICAgICBzdGFydCA9IHRvUGFyZW50W3RvUGFyZW50Lmxlbmd0aCAtIDFdO1xuICAgICAgZW5kID0gc3RhcnQgKyAxO1xuICAgICAgdG9QYXJlbnQgPSB0b1BhcmVudC5zbGljZSgwLCB0b1BhcmVudC5sZW5ndGggLSAxKTtcbiAgICB9XG4gICAgaWYgKGRlcHRoID09IDAgJiYgdHlwZXMubGVuZ3RoID09IDApIHJldHVybiBudWxsO1xuXG4gICAgdmFyIHBhcmVudCA9IGRvYy5wYXRoKHRvUGFyZW50KSxcbiAgICAgICAgcGFyZW50U2l6ZSA9IHBhcmVudC5zaXplLFxuICAgICAgICBuZXdQYXJlbnQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHBhcmVudC50eXBlLmxvY2tlZCkgcmV0dXJuIG51bGw7XG4gICAgaWYgKHR5cGVzLmxlbmd0aCkge1xuICAgICAgdmFyIF9yZXQgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbGFzdFdyYXBwZXIgPSB0eXBlc1t0eXBlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgdmFyIGNvbnRlbnQgPSBpbm5lci5jb250ZW50LnNsaWNlKGZyb20ub2Zmc2V0LCB0by5vZmZzZXQpO1xuICAgICAgICBpZiAoIXBhcmVudC50eXBlLmNhbkNvbnRhaW5UeXBlKHR5cGVzWzBdKSB8fCBjb250ZW50LnNvbWUoZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICByZXR1cm4gIWxhc3RXcmFwcGVyLmNhbkNvbnRhaW4obik7XG4gICAgICAgIH0pIHx8ICFpbm5lci5zaXplICYmICFsYXN0V3JhcHBlci5jYW5CZUVtcHR5IHx8IGxhc3RXcmFwcGVyLmxvY2tlZCkgcmV0dXJuIHtcbiAgICAgICAgICAgIHY6IG51bGxcbiAgICAgICAgICB9O1xuICAgICAgICB2YXIgbm9kZSA9IG51bGw7XG4gICAgICAgIGZvciAodmFyIGkgPSB0eXBlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIG5vZGUgPSB0eXBlc1tpXS5jcmVhdGUoYXR0cnNbaV0sIG5vZGUgfHwgY29udGVudCk7XG4gICAgICAgIH1uZXdQYXJlbnQgPSBwYXJlbnQuc3BsaWNlKHN0YXJ0LCBlbmQsIF9tb2RlbC5GcmFnbWVudC5mcm9tKG5vZGUpKTtcbiAgICAgIH0pKCk7XG5cbiAgICAgIGlmICh0eXBlb2YgX3JldCA9PT0gXCJvYmplY3RcIikgcmV0dXJuIF9yZXQudjtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFwYXJlbnQudHlwZS5jYW5Db250YWluRnJhZ21lbnQoaW5uZXIuY29udGVudCkgfHwgIWlubmVyLnNpemUgJiYgc3RhcnQgPT0gMCAmJiBlbmQgPT0gcGFyZW50LnNpemUgJiYgIXBhcmVudC50eXBlLmNhbkJlRW1wdHkpIHJldHVybiBudWxsO1xuICAgICAgbmV3UGFyZW50ID0gcGFyZW50LnNwbGljZShzdGFydCwgZW5kLCBpbm5lci5jb250ZW50KTtcbiAgICB9XG4gICAgdmFyIGNvcHkgPSBkb2MucmVwbGFjZURlZXAodG9QYXJlbnQsIG5ld1BhcmVudCk7XG5cbiAgICB2YXIgdG9Jbm5lciA9IHRvUGFyZW50LnNsaWNlKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdG9Jbm5lci5wdXNoKGkgPyAwIDogc3RhcnQpO1xuICAgIH12YXIgc3RhcnRPZklubmVyID0gbmV3IF9tb2RlbC5Qb3ModG9Jbm5lciwgdHlwZXMubGVuZ3RoID8gMCA6IHN0YXJ0KTtcbiAgICB2YXIgcmVwbGFjZWQgPSBudWxsO1xuICAgIHZhciBpbnNlcnRlZFNpemUgPSB0eXBlcy5sZW5ndGggPyAxIDogdG8ub2Zmc2V0IC0gZnJvbS5vZmZzZXQ7XG4gICAgaWYgKGRlcHRoICE9IHR5cGVzLmxlbmd0aCB8fCBkZXB0aCA+IDEgfHwgdHlwZXMubGVuZ3RoID4gMSkge1xuICAgICAgdmFyIHBvc0JlZm9yZSA9IG5ldyBfbW9kZWwuUG9zKHRvUGFyZW50LCBzdGFydCk7XG4gICAgICB2YXIgcG9zQWZ0ZXIxID0gbmV3IF9tb2RlbC5Qb3ModG9QYXJlbnQsIGVuZCksXG4gICAgICAgICAgcG9zQWZ0ZXIyID0gbmV3IF9tb2RlbC5Qb3ModG9QYXJlbnQsIHN0YXJ0ICsgaW5zZXJ0ZWRTaXplKTtcbiAgICAgIHZhciBlbmRPZklubmVyID0gbmV3IF9tb2RlbC5Qb3ModG9Jbm5lciwgc3RhcnRPZklubmVyLm9mZnNldCArICh0by5vZmZzZXQgLSBmcm9tLm9mZnNldCkpO1xuICAgICAgcmVwbGFjZWQgPSBbbmV3IF9tYXAuUmVwbGFjZWRSYW5nZShwb3NCZWZvcmUsIGZyb20sIHBvc0JlZm9yZSwgc3RhcnRPZklubmVyKSwgbmV3IF9tYXAuUmVwbGFjZWRSYW5nZSh0bywgcG9zQWZ0ZXIxLCBlbmRPZklubmVyLCBwb3NBZnRlcjIsIHBvc0FmdGVyMSwgcG9zQWZ0ZXIyKV07XG4gICAgfVxuICAgIHZhciBtb3ZlZCA9IFtuZXcgX21hcC5Nb3ZlZFJhbmdlKGZyb20sIHRvLm9mZnNldCAtIGZyb20ub2Zmc2V0LCBzdGFydE9mSW5uZXIpXTtcbiAgICBpZiAoZW5kIC0gc3RhcnQgIT0gaW5zZXJ0ZWRTaXplKSBtb3ZlZC5wdXNoKG5ldyBfbWFwLk1vdmVkUmFuZ2UobmV3IF9tb2RlbC5Qb3ModG9QYXJlbnQsIGVuZCksIHBhcmVudFNpemUgLSBlbmQsIG5ldyBfbW9kZWwuUG9zKHRvUGFyZW50LCBzdGFydCArIGluc2VydGVkU2l6ZSkpKTtcbiAgICByZXR1cm4gbmV3IF9zdGVwLlN0ZXBSZXN1bHQoY29weSwgbmV3IF9tYXAuUG9zTWFwKG1vdmVkLCByZXBsYWNlZCkpO1xuICB9LFxuICBpbnZlcnQ6IGZ1bmN0aW9uIGludmVydChzdGVwLCBvbGREb2MsIG1hcCkge1xuICAgIHZhciB0eXBlcyA9IFtdLFxuICAgICAgICBhdHRycyA9IFtdO1xuICAgIGlmIChzdGVwLnBhcmFtLmRlcHRoKSBmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXAucGFyYW0uZGVwdGg7IGkrKykge1xuICAgICAgdmFyIF9wYXJlbnQgPSBvbGREb2MucGF0aChzdGVwLmZyb20ucGF0aC5zbGljZSgwLCBzdGVwLmZyb20ucGF0aC5sZW5ndGggLSBpKSk7XG4gICAgICB0eXBlcy51bnNoaWZ0KF9wYXJlbnQudHlwZSk7XG4gICAgICBhdHRycy51bnNoaWZ0KF9wYXJlbnQuYXR0cnMpO1xuICAgIH1cbiAgICB2YXIgbmV3RnJvbSA9IG1hcC5tYXAoc3RlcC5mcm9tKS5wb3M7XG4gICAgdmFyIG5ld1RvID0gc3RlcC5mcm9tLmNtcChzdGVwLnRvKSA/IG1hcC5tYXAoc3RlcC50bywgLTEpLnBvcyA6IG5ld0Zyb207XG4gICAgcmV0dXJuIG5ldyBfc3RlcC5TdGVwKFwiYW5jZXN0b3JcIiwgbmV3RnJvbSwgbmV3VG8sIG51bGwsIHsgZGVwdGg6IHN0ZXAucGFyYW0udHlwZXMgPyBzdGVwLnBhcmFtLnR5cGVzLmxlbmd0aCA6IDAsXG4gICAgICB0eXBlczogdHlwZXMsIGF0dHJzOiBhdHRycyB9KTtcbiAgfSxcbiAgcGFyYW1Ub0pTT046IGZ1bmN0aW9uIHBhcmFtVG9KU09OKHBhcmFtKSB7XG4gICAgcmV0dXJuIHsgZGVwdGg6IHBhcmFtLmRlcHRoLFxuICAgICAgdHlwZXM6IHBhcmFtLnR5cGVzICYmIHBhcmFtLnR5cGVzLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdC5uYW1lO1xuICAgICAgfSksXG4gICAgICBhdHRyczogcGFyYW0uYXR0cnMgfTtcbiAgfSxcbiAgcGFyYW1Gcm9tSlNPTjogZnVuY3Rpb24gcGFyYW1Gcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICByZXR1cm4geyBkZXB0aDoganNvbi5kZXB0aCxcbiAgICAgIHR5cGVzOiBqc29uLnR5cGVzICYmIGpzb24udHlwZXMubWFwKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgIHJldHVybiBzY2hlbWEubm9kZVR5cGUobik7XG4gICAgICB9KSxcbiAgICAgIGF0dHJzOiBqc29uLmF0dHJzIH07XG4gIH1cbn0pO1xuXG5mdW5jdGlvbiBjYW5CZUxpZnRlZChkb2MsIHJhbmdlKSB7XG4gIHZhciBjb250ZW50ID0gW2RvYy5wYXRoKHJhbmdlLmZyb20ucGF0aCldLFxuICAgICAgdW53cmFwID0gZmFsc2U7XG4gIGZvciAoOzspIHtcbiAgICB2YXIgcGFyZW50RGVwdGggPSAtMTtcblxuICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIChfbm9kZSwgaSkge1xuICAgICAgaWYgKCFjb250ZW50LnNvbWUoZnVuY3Rpb24gKGlubmVyKSB7XG4gICAgICAgIHJldHVybiAhX25vZGUudHlwZS5jYW5Db250YWluQ29udGVudChpbm5lci50eXBlKTtcbiAgICAgIH0pKSBwYXJlbnREZXB0aCA9IGk7XG4gICAgICBfbm9kZSA9IF9ub2RlLmNoaWxkKHJhbmdlLmZyb20ucGF0aFtpXSk7XG4gICAgICBub2RlID0gX25vZGU7XG4gICAgfTtcblxuICAgIGZvciAodmFyIG5vZGUgPSBkb2MsIGkgPSAwOyBpIDwgcmFuZ2UuZnJvbS5wYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICBfbG9vcChub2RlLCBpKTtcbiAgICB9XG4gICAgaWYgKHBhcmVudERlcHRoID4gLTEpIHJldHVybiB7IHBhdGg6IHJhbmdlLmZyb20ucGF0aC5zbGljZSgwLCBwYXJlbnREZXB0aCksIHVud3JhcDogdW53cmFwIH07XG4gICAgaWYgKHVud3JhcCB8fCAhY29udGVudFswXS5pc0Jsb2NrKSByZXR1cm4gbnVsbDtcbiAgICBjb250ZW50ID0gY29udGVudFswXS5jb250ZW50LnNsaWNlKHJhbmdlLmZyb20ub2Zmc2V0LCByYW5nZS50by5vZmZzZXQpO1xuICAgIHVud3JhcCA9IHRydWU7XG4gIH1cbn1cblxuLy8gOjogKE5vZGUsIFBvcywgP1Bvcykg4oaSIGJvb2xcbi8vIFRlbGxzIHlvdSB3aGV0aGVyIHRoZSBnaXZlbiBwb3NpdGlvbnMnIFtzaWJsaW5nXG4vLyByYW5nZV0oI05vZGUuc2libGluZ1JhbmdlKSwgb3IgYW55IG9mIGl0cyBhbmNlc3RvciBub2RlcywgY2FuIGJlXG4vLyBsaWZ0ZWQgb3V0IG9mIGEgcGFyZW50LlxuXG5mdW5jdGlvbiBjYW5MaWZ0KGRvYywgZnJvbSwgdG8pIHtcbiAgdmFyIHJhbmdlID0gZG9jLnNpYmxpbmdSYW5nZShmcm9tLCB0byB8fCBmcm9tKTtcbiAgdmFyIGZvdW5kID0gY2FuQmVMaWZ0ZWQoZG9jLCByYW5nZSk7XG4gIGlmIChmb3VuZCkgcmV0dXJuIHsgZm91bmQ6IGZvdW5kLCByYW5nZTogcmFuZ2UgfTtcbn1cblxuLy8gOjogKFBvcywgP1Bvcykg4oaSIFRyYW5zZm9ybVxuLy8gTGlmdCB0aGUgbmVhcmVzdCBsaWZ0YWJsZSBhbmNlc3RvciBvZiB0aGUgW3NpYmxpbmdcbi8vIHJhbmdlXSgjTm9kZS5zaWJsaW5nUmFuZ2UpIG9mIHRoZSBnaXZlbiBwb3NpdGlvbnMgb3V0IG9mIGl0c1xuLy8gcGFyZW50IChvciBkbyBub3RoaW5nIGlmIG5vIHN1Y2ggbm9kZSBleGlzdHMpLlxuX3RyYW5zZm9ybS5UcmFuc2Zvcm0ucHJvdG90eXBlLmxpZnQgPSBmdW5jdGlvbiAoZnJvbSkge1xuICB2YXIgdG8gPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyBmcm9tIDogYXJndW1lbnRzWzFdO1xuICByZXR1cm4gKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY2FuID0gY2FuTGlmdCh0aGlzLmRvYywgZnJvbSwgdG8pO1xuICAgIGlmICghY2FuKSByZXR1cm4gdGhpcztcbiAgICB2YXIgZm91bmQgPSBjYW4uZm91bmQ7XG4gICAgdmFyIHJhbmdlID0gY2FuLnJhbmdlO1xuXG4gICAgdmFyIGRlcHRoID0gcmFuZ2UuZnJvbS5wYXRoLmxlbmd0aCAtIGZvdW5kLnBhdGgubGVuZ3RoO1xuICAgIHZhciByYW5nZU5vZGUgPSBmb3VuZC51bndyYXAgJiYgdGhpcy5kb2MucGF0aChyYW5nZS5mcm9tLnBhdGgpO1xuXG4gICAgZm9yICh2YXIgZCA9IDAsIHBvcyA9IHJhbmdlLnRvOzsgZCsrKSB7XG4gICAgICBpZiAocG9zLm9mZnNldCA8IHRoaXMuZG9jLnBhdGgocG9zLnBhdGgpLnNpemUpIHtcbiAgICAgICAgdGhpcy5zcGxpdChwb3MsIGRlcHRoIC0gZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGQgPT0gZGVwdGggLSAxKSBicmVhaztcbiAgICAgIHBvcyA9IHBvcy5zaG9ydGVuKG51bGwsIDEpO1xuICAgIH1cbiAgICBmb3IgKHZhciBkID0gMCwgcG9zID0gcmFuZ2UuZnJvbTs7IGQrKykge1xuICAgICAgaWYgKHBvcy5vZmZzZXQgPiAwKSB7XG4gICAgICAgIHRoaXMuc3BsaXQocG9zLCBkZXB0aCAtIGQpO1xuICAgICAgICB2YXIgY3V0ID0gcmFuZ2UuZnJvbS5wYXRoLmxlbmd0aCAtIGRlcHRoLFxuICAgICAgICAgICAgcGF0aCA9IHBvcy5wYXRoLnNsaWNlKDAsIGN1dCkuY29uY2F0KHBvcy5wYXRoW2N1dF0gKyAxKTtcbiAgICAgICAgd2hpbGUgKHBhdGgubGVuZ3RoIDwgcmFuZ2UuZnJvbS5wYXRoLmxlbmd0aCkgcGF0aC5wdXNoKDApO1xuICAgICAgICByYW5nZSA9IHsgZnJvbTogbmV3IF9tb2RlbC5Qb3MocGF0aCwgMCksIHRvOiBuZXcgX21vZGVsLlBvcyhwYXRoLCByYW5nZS50by5vZmZzZXQgLSByYW5nZS5mcm9tLm9mZnNldCkgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoZCA9PSBkZXB0aCAtIDEpIGJyZWFrO1xuICAgICAgcG9zID0gcG9zLnNob3J0ZW4oKTtcbiAgICB9XG4gICAgaWYgKGZvdW5kLnVud3JhcCkge1xuICAgICAgZm9yICh2YXIgaSA9IHJhbmdlLnRvLm9mZnNldCAtIDE7IGkgPiByYW5nZS5mcm9tLm9mZnNldDsgaS0tKSB7XG4gICAgICAgIHRoaXMuam9pbihuZXcgX21vZGVsLlBvcyhyYW5nZS5mcm9tLnBhdGgsIGkpKTtcbiAgICAgIH12YXIgc2l6ZSA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gcmFuZ2VOb2RlLml0ZXIocmFuZ2UuZnJvbS5vZmZzZXQsIHJhbmdlLnRvLm9mZnNldCksIGNoaWxkID0gdW5kZWZpbmVkOyBjaGlsZCA9IGkubmV4dCgpLnZhbHVlOykge1xuICAgICAgICBzaXplICs9IGNoaWxkLnNpemU7XG4gICAgICB9dmFyIHBhdGggPSByYW5nZS5mcm9tLnBhdGguY29uY2F0KHJhbmdlLmZyb20ub2Zmc2V0KTtcbiAgICAgIHJhbmdlID0geyBmcm9tOiBuZXcgX21vZGVsLlBvcyhwYXRoLCAwKSwgdG86IG5ldyBfbW9kZWwuUG9zKHBhdGgsIHNpemUpIH07XG4gICAgICArK2RlcHRoO1xuICAgIH1cbiAgICB0aGlzLnN0ZXAoXCJhbmNlc3RvclwiLCByYW5nZS5mcm9tLCByYW5nZS50bywgbnVsbCwgeyBkZXB0aDogZGVwdGggfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xuXG4vLyA6OiAoTm9kZSwgUG9zLCA/UG9zLCBOb2RlVHlwZSkg4oaSIGJvb2xcbi8vIERldGVybWluZXMgd2hldGhlciB0aGUgW3NpYmxpbmcgcmFuZ2VdKCNOb2RlLnNpYmxpbmdSYW5nZSkgb2YgdGhlXG4vLyBnaXZlbiBwb3NpdGlvbnMgY2FuIGJlIHdyYXBwZWQgaW4gdGhlIGdpdmVuIG5vZGUgdHlwZS5cblxuZnVuY3Rpb24gY2FuV3JhcChkb2MsIGZyb20sIHRvLCB0eXBlKSB7XG4gIHZhciByYW5nZSA9IGRvYy5zaWJsaW5nUmFuZ2UoZnJvbSwgdG8gfHwgZnJvbSk7XG4gIGlmIChyYW5nZS5mcm9tLm9mZnNldCA9PSByYW5nZS50by5vZmZzZXQpIHJldHVybiBudWxsO1xuICB2YXIgcGFyZW50ID0gZG9jLnBhdGgocmFuZ2UuZnJvbS5wYXRoKTtcbiAgdmFyIGFyb3VuZCA9IHBhcmVudC50eXBlLmZpbmRDb25uZWN0aW9uKHR5cGUpO1xuICB2YXIgaW5zaWRlID0gdHlwZS5maW5kQ29ubmVjdGlvbihwYXJlbnQuY2hpbGQocmFuZ2UuZnJvbS5vZmZzZXQpLnR5cGUpO1xuICBpZiAoYXJvdW5kICYmIGluc2lkZSkgcmV0dXJuIHsgcmFuZ2U6IHJhbmdlLCBhcm91bmQ6IGFyb3VuZCwgaW5zaWRlOiBpbnNpZGUgfTtcbn1cblxuLy8gOjogKFBvcywgP1BvcywgTm9kZVR5cGUsID9PYmplY3QpIOKGkiBUcmFuc2Zvcm1cbi8vIFdyYXAgdGhlIFtzaWJsaW5nIHJhbmdlXSgjTm9kZS5zaWJsaW5nUmFuZ2UpIG9mIHRoZSBnaXZlbiBwb3NpdGlvbnNcbi8vIGluIGEgbm9kZSBvZiB0aGUgZ2l2ZW4gdHlwZSwgd2l0aCB0aGUgZ2l2ZW4gYXR0cmlidXRlcyAoaWZcbi8vIHBvc3NpYmxlKS5cbl90cmFuc2Zvcm0uVHJhbnNmb3JtLnByb3RvdHlwZS53cmFwID0gZnVuY3Rpb24gKGZyb20sIHRvLCB0eXBlLCB3cmFwQXR0cnMpIHtcbiAgdmFyIGNhbiA9IGNhbldyYXAodGhpcy5kb2MsIGZyb20sIHRvLCB0eXBlKTtcbiAgaWYgKCFjYW4pIHJldHVybiB0aGlzO1xuICB2YXIgcmFuZ2UgPSBjYW4ucmFuZ2U7XG4gIHZhciBhcm91bmQgPSBjYW4uYXJvdW5kO1xuICB2YXIgaW5zaWRlID0gY2FuLmluc2lkZTtcblxuICB2YXIgdHlwZXMgPSBhcm91bmQuY29uY2F0KHR5cGUpLmNvbmNhdChpbnNpZGUpO1xuICB2YXIgYXR0cnMgPSBhcm91bmQubWFwKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSkuY29uY2F0KHdyYXBBdHRycykuY29uY2F0KGluc2lkZS5tYXAoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9KSk7XG4gIHRoaXMuc3RlcChcImFuY2VzdG9yXCIsIHJhbmdlLmZyb20sIHJhbmdlLnRvLCBudWxsLCB7IHR5cGVzOiB0eXBlcywgYXR0cnM6IGF0dHJzIH0pO1xuICBpZiAoaW5zaWRlLmxlbmd0aCkge1xuICAgIHZhciB0b0lubmVyID0gcmFuZ2UuZnJvbS5wYXRoLnNsaWNlKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcm91bmQubGVuZ3RoICsgaW5zaWRlLmxlbmd0aCArIDE7IGkrKykge1xuICAgICAgdG9Jbm5lci5wdXNoKGkgPyAwIDogcmFuZ2UuZnJvbS5vZmZzZXQpO1xuICAgIH1mb3IgKHZhciBpID0gcmFuZ2UudG8ub2Zmc2V0IC0gMSAtIHJhbmdlLmZyb20ub2Zmc2V0OyBpID4gMDsgaS0tKSB7XG4gICAgICB0aGlzLnNwbGl0KG5ldyBfbW9kZWwuUG9zKHRvSW5uZXIsIGkpLCBpbnNpZGUubGVuZ3RoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyA6OiAoUG9zLCA/UG9zLCBOb2RlVHlwZSwgP09iamVjdCkg4oaSIFRyYW5zZm9ybVxuLy8gU2V0IHRoZSB0eXBlIG9mIGFsbCB0ZXh0YmxvY2tzIChwYXJ0bHkpIGJldHdlZW4gYGZyb21gIGFuZCBgdG9gIHRvXG4vLyB0aGUgZ2l2ZW4gbm9kZSB0eXBlIHdpdGggdGhlIGdpdmVuIGF0dHJpYnV0ZXMuXG5fdHJhbnNmb3JtLlRyYW5zZm9ybS5wcm90b3R5cGUuc2V0QmxvY2tUeXBlID0gZnVuY3Rpb24gKGZyb20sIHRvLCB0eXBlLCBhdHRycykge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIHRoaXMuZG9jLm5vZGVzQmV0d2Vlbihmcm9tLCB0byB8fCBmcm9tLCBmdW5jdGlvbiAobm9kZSwgcGF0aCkge1xuICAgIGlmIChub2RlLmlzVGV4dGJsb2NrICYmICFub2RlLmhhc01hcmt1cCh0eXBlLCBhdHRycykpIHtcbiAgICAgIHBhdGggPSBwYXRoLnNsaWNlKCk7XG4gICAgICAvLyBFbnN1cmUgYWxsIG1hcmt1cCB0aGF0IGlzbid0IGFsbG93ZWQgaW4gdGhlIG5ldyBub2RlIHR5cGUgaXMgY2xlYXJlZFxuICAgICAgX3RoaXMuY2xlYXJNYXJrdXAobmV3IF9tb2RlbC5Qb3MocGF0aCwgMCksIG5ldyBfbW9kZWwuUG9zKHBhdGgsIG5vZGUuc2l6ZSksIHR5cGUpO1xuICAgICAgX3RoaXMuc3RlcChcImFuY2VzdG9yXCIsIG5ldyBfbW9kZWwuUG9zKHBhdGgsIDApLCBuZXcgX21vZGVsLlBvcyhwYXRoLCBfdGhpcy5kb2MucGF0aChwYXRoKS5zaXplKSwgbnVsbCwgeyBkZXB0aDogMSwgdHlwZXM6IFt0eXBlXSwgYXR0cnM6IFthdHRyc10gfSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyA6OiAoUG9zLCBOb2RlVHlwZSwgP09iamVjdCkg4oaSIFRyYW5zZm9ybVxuLy8gQ2hhbmdlIHRoZSB0eXBlIGFuZCBhdHRyaWJ1dGVzIG9mIHRoZSBub2RlIGFmdGVyIGBwb3NgLlxuX3RyYW5zZm9ybS5UcmFuc2Zvcm0ucHJvdG90eXBlLnNldE5vZGVUeXBlID0gZnVuY3Rpb24gKHBvcywgdHlwZSwgYXR0cnMpIHtcbiAgdmFyIG5vZGUgPSB0aGlzLmRvYy5ub2RlQWZ0ZXIocG9zKTtcbiAgdmFyIHBhdGggPSBwb3MudG9QYXRoKCk7XG4gIHRoaXMuc3RlcChcImFuY2VzdG9yXCIsIG5ldyBfbW9kZWwuUG9zKHBhdGgsIDApLCBuZXcgX21vZGVsLlBvcyhwYXRoLCBub2RlLnNpemUpLCBudWxsLCB7IGRlcHRoOiAxLCB0eXBlczogW3R5cGVdLCBhdHRyczogW2F0dHJzXSB9KTtcbiAgcmV0dXJuIHRoaXM7XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG5yZXF1aXJlKFwiLi9tYXJrXCIpO1xuXG5yZXF1aXJlKFwiLi9zcGxpdFwiKTtcblxucmVxdWlyZShcIi4vcmVwbGFjZVwiKTtcblxuLy8gISEgVGhpcyBtb2R1bGUgZGVmaW5lcyBhIHdheSB0byB0cmFuc2Zvcm0gZG9jdW1lbnRzLiBUcmFuc2Zvcm1pbmdcbi8vIGhhcHBlbnMgaW4gYFN0ZXBgcywgd2hpY2ggYXJlIGF0b21pYywgd2VsbC1kZWZpbmVkIG1vZGlmaWNhdGlvbnMgdG9cbi8vIGEgZG9jdW1lbnQuIFtBcHBseWluZ10oYFN0ZXAuYXBwbHlgKSBhIHN0ZXAgcHJvZHVjZXMgYSBuZXcgZG9jdW1lbnRcbi8vIGFuZCBhIFtwb3NpdGlvbiBtYXBdKCNQb3NNYXApIHRoYXQgbWFwcyBwb3NpdGlvbnMgaW4gdGhlIG9sZFxuLy8gZG9jdW1lbnQgdG8gcG9zaXRpb24gaW4gdGhlIG5ldyBkb2N1bWVudC4gU3RlcHMgY2FuIGJlXG4vLyBbaW52ZXJ0ZWRdKCNTdGVwLmludmVydCkgdG8gY3JlYXRlIGEgc3RlcCB0aGF0IHVuZG9lcyB0aGVpciBlZmZlY3QsXG4vLyBhbmQgY2hhaW5lZCB0b2dldGhlciBpbiBhIGNvbnZlbmllbmNlIG9iamVjdCBjYWxsZWQgYSBgVHJhbnNmb3JtYC5cbi8vXG4vLyBUaGlzIG1vZHVsZSBkb2VzIG5vdCBkZXBlbmQgb24gdGhlIGJyb3dzZXIgQVBJIGJlaW5nIGF2YWlsYWJsZVxuLy8gKGkuZS4geW91IGNhbiBsb2FkIGl0IGludG8gYW55IEphdmFTY3JpcHQgZW52aXJvbm1lbnQpLlxuLy9cbi8vIFRoZXNlIGFyZSB0aGUgdHlwZXMgb2Ygc3RlcHMgZGVmaW5lZDpcbnZhciBfdHJhbnNmb3JtID0gcmVxdWlyZShcIi4vdHJhbnNmb3JtXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUcmFuc2Zvcm1cIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3RyYW5zZm9ybS5UcmFuc2Zvcm07XG4gIH1cbn0pO1xuXG52YXIgX3N0ZXAgPSByZXF1aXJlKFwiLi9zdGVwXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJTdGVwXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9zdGVwLlN0ZXA7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiU3RlcFJlc3VsdFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfc3RlcC5TdGVwUmVzdWx0O1xuICB9XG59KTtcblxudmFyIF9hbmNlc3RvciA9IHJlcXVpcmUoXCIuL2FuY2VzdG9yXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJjYW5MaWZ0XCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9hbmNlc3Rvci5jYW5MaWZ0O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImNhbldyYXBcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2FuY2VzdG9yLmNhbldyYXA7XG4gIH1cbn0pO1xuXG52YXIgX2pvaW4gPSByZXF1aXJlKFwiLi9qb2luXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJqb2luUG9pbnRcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2pvaW4uam9pblBvaW50O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImpvaW5hYmxlQmxvY2tzXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9qb2luLmpvaW5hYmxlQmxvY2tzO1xuICB9XG59KTtcblxudmFyIF9tYXAgPSByZXF1aXJlKFwiLi9tYXBcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlBvc01hcFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfbWFwLlBvc01hcDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNYXBSZXN1bHRcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX21hcC5NYXBSZXN1bHQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVtYXBwaW5nXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9tYXAuUmVtYXBwaW5nO1xuICB9XG59KTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuam9pbmFibGVCbG9ja3MgPSBqb2luYWJsZUJsb2NrcztcbmV4cG9ydHMuam9pblBvaW50ID0gam9pblBvaW50O1xuXG52YXIgX21vZGVsID0gcmVxdWlyZShcIi4uL21vZGVsXCIpO1xuXG52YXIgX3RyYW5zZm9ybSA9IHJlcXVpcmUoXCIuL3RyYW5zZm9ybVwiKTtcblxudmFyIF9zdGVwID0gcmVxdWlyZShcIi4vc3RlcFwiKTtcblxudmFyIF9tYXAgPSByZXF1aXJlKFwiLi9tYXBcIik7XG5cbi8vICEhICoqYGpvaW5gKipcbi8vICAgOiBKb2luIHR3byBibG9jayBlbGVtZW50cyB0b2dldGhlci4gYGZyb21gIGFuZCBgdG9gIG11c3QgcG9pbnQgYXRcbi8vICAgICB0aGUgZW5kIG9mIHRoZSBmaXJzdCBhbmQgc3RhcnQgb2YgdGhlIHNlY29uZCBlbGVtZW50IChzbyB0aGF0XG4vLyAgICAgdGhlIGludGVudGlvbiBpcyBwcmVzZXJ2ZWQgZXZlbiB3aGVuIHRoZSBwb3NpdGlvbnMgYXJlIG1hcHBlZCkuXG5cbl9zdGVwLlN0ZXAuZGVmaW5lKFwiam9pblwiLCB7XG4gIGFwcGx5OiBmdW5jdGlvbiBhcHBseShkb2MsIHN0ZXApIHtcbiAgICB2YXIgYmVmb3JlID0gZG9jLnBhdGgoc3RlcC5mcm9tLnBhdGgpO1xuICAgIHZhciBhZnRlciA9IGRvYy5wYXRoKHN0ZXAudG8ucGF0aCk7XG4gICAgaWYgKHN0ZXAuZnJvbS5vZmZzZXQgPCBiZWZvcmUuc2l6ZSB8fCBzdGVwLnRvLm9mZnNldCA+IDAgfHwgIWJlZm9yZS50eXBlLmNhbkNvbnRhaW5GcmFnbWVudChhZnRlci5jb250ZW50KSkgcmV0dXJuIG51bGw7XG4gICAgdmFyIHBGcm9tID0gc3RlcC5mcm9tLnBhdGgsXG4gICAgICAgIHBUbyA9IHN0ZXAudG8ucGF0aDtcbiAgICB2YXIgbGFzdCA9IHBGcm9tLmxlbmd0aCAtIDEsXG4gICAgICAgIG9mZnNldCA9IHBGcm9tW2xhc3RdICsgMTtcbiAgICBpZiAocEZyb20ubGVuZ3RoICE9IHBUby5sZW5ndGggfHwgcEZyb20ubGVuZ3RoID09IDAgfHwgb2Zmc2V0ICE9IHBUb1tsYXN0XSkgcmV0dXJuIG51bGw7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXN0OyBpKyspIHtcbiAgICAgIGlmIChwRnJvbVtpXSAhPSBwVG9baV0pIHJldHVybiBudWxsO1xuICAgIH12YXIgdGFyZ2V0UGF0aCA9IHBGcm9tLnNsaWNlKDAsIGxhc3QpO1xuICAgIHZhciB0YXJnZXQgPSBkb2MucGF0aCh0YXJnZXRQYXRoKSxcbiAgICAgICAgb2xkU2l6ZSA9IHRhcmdldC5zaXplO1xuICAgIGlmICh0YXJnZXQudHlwZS5sb2NrZWQpIHJldHVybiBudWxsO1xuICAgIHZhciBqb2luZWQgPSBiZWZvcmUuYXBwZW5kKGFmdGVyLmNvbnRlbnQpO1xuICAgIHZhciBjb3B5ID0gZG9jLnJlcGxhY2VEZWVwKHRhcmdldFBhdGgsIHRhcmdldC5zcGxpY2Uob2Zmc2V0IC0gMSwgb2Zmc2V0ICsgMSwgX21vZGVsLkZyYWdtZW50LmZyb20oam9pbmVkKSkpO1xuXG4gICAgdmFyIG1hcCA9IG5ldyBfbWFwLlBvc01hcChbbmV3IF9tYXAuTW92ZWRSYW5nZShzdGVwLnRvLCBhZnRlci5zaXplLCBzdGVwLmZyb20pLCBuZXcgX21hcC5Nb3ZlZFJhbmdlKG5ldyBfbW9kZWwuUG9zKHRhcmdldFBhdGgsIG9mZnNldCArIDEpLCBvbGRTaXplIC0gb2Zmc2V0IC0gMSwgbmV3IF9tb2RlbC5Qb3ModGFyZ2V0UGF0aCwgb2Zmc2V0KSldLCBbbmV3IF9tYXAuUmVwbGFjZWRSYW5nZShzdGVwLmZyb20sIHN0ZXAudG8sIHN0ZXAuZnJvbSwgc3RlcC5mcm9tLCBzdGVwLnRvLnNob3J0ZW4oKSldKTtcbiAgICByZXR1cm4gbmV3IF9zdGVwLlN0ZXBSZXN1bHQoY29weSwgbWFwKTtcbiAgfSxcbiAgaW52ZXJ0OiBmdW5jdGlvbiBpbnZlcnQoc3RlcCwgb2xkRG9jKSB7XG4gICAgcmV0dXJuIG5ldyBfc3RlcC5TdGVwKFwic3BsaXRcIiwgbnVsbCwgbnVsbCwgc3RlcC5mcm9tLCBvbGREb2MucGF0aChzdGVwLnRvLnBhdGgpLmNvcHkoKSk7XG4gIH1cbn0pO1xuXG4vLyA6OiAoTm9kZSwgUG9zKSDihpIgYm9vbFxuLy8gVGVzdCB3aGV0aGVyIHRoZSBibG9ja3MgYmVmb3JlIGFuZCBhZnRlciBhIGdpdmVuIHBvc2l0aW9uIGNhbiBiZVxuLy8gam9pbmVkLlxuXG5mdW5jdGlvbiBqb2luYWJsZUJsb2Nrcyhkb2MsIHBvcykge1xuICBpZiAocG9zLm9mZnNldCA9PSAwKSByZXR1cm4gZmFsc2U7XG4gIHZhciBwYXJlbnQgPSBkb2MucGF0aChwb3MucGF0aCk7XG4gIGlmIChwYXJlbnQuaXNUZXh0YmxvY2sgfHwgcG9zLm9mZnNldCA9PSBwYXJlbnQuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICB2YXIgdHlwZSA9IHBhcmVudC5jaGlsZChwb3Mub2Zmc2V0IC0gMSkudHlwZTtcbiAgcmV0dXJuICF0eXBlLmlzVGV4dGJsb2NrICYmIHR5cGUuY29udGFpbnMgJiYgdHlwZSA9PSBwYXJlbnQuY2hpbGQocG9zLm9mZnNldCkudHlwZTtcbn1cblxuLy8gOjogKE5vZGUsIFBvcywgP251bWJlcikg4oaSID9Qb3Ncbi8vIEZpbmQgYW4gYW5jZXN0b3Igb2YgdGhlIGdpdmVuIHBvc2l0aW9uIHRoYXQgY2FuIGJlIGpvaW5lZCB0byB0aGVcbi8vIGJsb2NrIGJlZm9yZSAob3IgYWZ0ZXIgaWYgYGRpcmAgaXMgcG9zaXRpdmUpLiBSZXR1cm5zIHRoZSBqb2luYWJsZVxuLy8gcG9pbnQsIGlmIGFueS5cblxuZnVuY3Rpb24gam9pblBvaW50KGRvYywgcG9zKSB7XG4gIHZhciBkaXIgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDIgfHwgYXJndW1lbnRzWzJdID09PSB1bmRlZmluZWQgPyAtMSA6IGFyZ3VtZW50c1syXTtcblxuICBmb3IgKDs7KSB7XG4gICAgaWYgKGpvaW5hYmxlQmxvY2tzKGRvYywgcG9zKSkgcmV0dXJuIHBvcztcbiAgICBpZiAocG9zLmRlcHRoID09IDApIHJldHVybiBudWxsO1xuICAgIHBvcyA9IHBvcy5zaG9ydGVuKG51bGwsIGRpciA8IDAgPyAwIDogMSk7XG4gIH1cbn1cblxuLy8gOjogKFBvcykg4oaSIFRyYW5zZm9ybVxuLy8gSm9pbiB0aGUgYmxvY2tzIGFyb3VuZCB0aGUgZ2l2ZW4gcG9zaXRpb24uXG5fdHJhbnNmb3JtLlRyYW5zZm9ybS5wcm90b3R5cGUuam9pbiA9IGZ1bmN0aW9uIChhdCkge1xuICB2YXIgcGFyZW50ID0gdGhpcy5kb2MucGF0aChhdC5wYXRoKTtcbiAgaWYgKGF0Lm9mZnNldCA9PSAwIHx8IGF0Lm9mZnNldCA9PSBwYXJlbnQuc2l6ZSB8fCBwYXJlbnQuaXNUZXh0YmxvY2spIHJldHVybiB0aGlzO1xuICB0aGlzLnN0ZXAoXCJqb2luXCIsIG5ldyBfbW9kZWwuUG9zKGF0LnBhdGguY29uY2F0KGF0Lm9mZnNldCAtIDEpLCBwYXJlbnQuY2hpbGQoYXQub2Zmc2V0IC0gMSkuc2l6ZSksIG5ldyBfbW9kZWwuUG9zKGF0LnBhdGguY29uY2F0KGF0Lm9mZnNldCksIDApKTtcbiAgcmV0dXJuIHRoaXM7XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBfbW9kZWwgPSByZXF1aXJlKFwiLi4vbW9kZWxcIik7XG5cbi8vIDs7ICNraW5kPWludGVyZmFjZSAjcGF0aD1NYXBwYWJsZSAjdG9jPWZhbHNlXG4vLyBUaGVyZSBhcmUgdmFyaW91cyB0aGluZ3MgdGhhdCBwb3NpdGlvbnMgY2FuIGJlIG1hcHBlZCB0aHJvdWdoLlxuLy8gV2UnbGwgZGVub3RlIHRob3NlIGFzICdtYXBwYWJsZScuIFRoaXMgaXMgbm90IGFuIGFjdHVhbCBjbGFzcyBpblxuLy8gdGhlIGNvZGViYXNlLCBvbmx5IGFuIGFncmVlZC1vbiBpbnRlcmZhY2UuXG5cbi8vIDo6IChwb3M6IFBvcywgYmlhczogP251bWJlcikg4oaSIE1hcFJlc3VsdFxuLy8gI3BhdGg9TWFwcGFibGUubWFwXG4vLyBNYXAgYSBwb3NpdGlvbiB0aHJvdWdoIHRoaXMgb2JqZWN0LiBXaGVuIGdpdmVuLCB0aGUgYGJpYXNgXG4vLyBkZXRlcm1pbmVzIGluIHdoaWNoIGRpcmVjdGlvbiB0byBtb3ZlIHdoZW4gYSBjaHVuayBvZiBjb250ZW50IGlzXG4vLyBpbnNlcnRlZCBhdCBvciBhcm91bmQgdGhlIG1hcHBlZCBwb3NpdGlvbi5cblxudmFyIE1vdmVkUmFuZ2UgPSAoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBNb3ZlZFJhbmdlKHN0YXJ0LCBzaXplKSB7XG4gICAgdmFyIGRlc3QgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDIgfHwgYXJndW1lbnRzWzJdID09PSB1bmRlZmluZWQgPyBudWxsIDogYXJndW1lbnRzWzJdO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE1vdmVkUmFuZ2UpO1xuXG4gICAgdGhpcy5zdGFydCA9IHN0YXJ0O1xuICAgIHRoaXMuc2l6ZSA9IHNpemU7XG4gICAgdGhpcy5kZXN0ID0gZGVzdDtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhNb3ZlZFJhbmdlLCBbe1xuICAgIGtleTogXCJ0b1N0cmluZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICAgIHJldHVybiBcIlttb3ZlZCBcIiArIHRoaXMuc3RhcnQgKyBcIitcIiArIHRoaXMuc2l6ZSArIFwiIHRvIFwiICsgdGhpcy5kZXN0ICsgXCJdXCI7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVuZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIG5ldyBfbW9kZWwuUG9zKHRoaXMuc3RhcnQucGF0aCwgdGhpcy5zdGFydC5vZmZzZXQgKyB0aGlzLnNpemUpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBNb3ZlZFJhbmdlO1xufSkoKTtcblxuZXhwb3J0cy5Nb3ZlZFJhbmdlID0gTW92ZWRSYW5nZTtcblxudmFyIFNpZGUgPSBmdW5jdGlvbiBTaWRlKGZyb20sIHRvLCByZWYpIHtcbiAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFNpZGUpO1xuXG4gIHRoaXMuZnJvbSA9IGZyb207XG4gIHRoaXMudG8gPSB0bztcbiAgdGhpcy5yZWYgPSByZWY7XG59O1xuXG52YXIgUmVwbGFjZWRSYW5nZSA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFJlcGxhY2VkUmFuZ2UoZnJvbSwgdG8sIG5ld0Zyb20sIG5ld1RvKSB7XG4gICAgdmFyIHJlZiA9IGFyZ3VtZW50cy5sZW5ndGggPD0gNCB8fCBhcmd1bWVudHNbNF0gPT09IHVuZGVmaW5lZCA/IGZyb20gOiBhcmd1bWVudHNbNF07XG4gICAgdmFyIG5ld1JlZiA9IGFyZ3VtZW50cy5sZW5ndGggPD0gNSB8fCBhcmd1bWVudHNbNV0gPT09IHVuZGVmaW5lZCA/IG5ld0Zyb20gOiBhcmd1bWVudHNbNV07XG4gICAgcmV0dXJuIChmdW5jdGlvbiAoKSB7XG4gICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUmVwbGFjZWRSYW5nZSk7XG5cbiAgICAgIHRoaXMuYmVmb3JlID0gbmV3IFNpZGUoZnJvbSwgdG8sIHJlZik7XG4gICAgICB0aGlzLmFmdGVyID0gbmV3IFNpZGUobmV3RnJvbSwgbmV3VG8sIG5ld1JlZik7XG4gICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhSZXBsYWNlZFJhbmdlLCBbe1xuICAgIGtleTogXCJ0b1N0cmluZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICAgIHJldHVybiBcIltyZXBsYWNlZCBcIiArIHRoaXMuYmVmb3JlLmZyb20gKyBcIi1cIiArIHRoaXMuYmVmb3JlLnRvICsgXCIgd2l0aCBcIiArIHRoaXMuYWZ0ZXIuZnJvbSArIFwiLVwiICsgdGhpcy5hZnRlci50byArIFwiXVwiO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBSZXBsYWNlZFJhbmdlO1xufSkoKTtcblxuZXhwb3J0cy5SZXBsYWNlZFJhbmdlID0gUmVwbGFjZWRSYW5nZTtcblxudmFyIGVtcHR5ID0gW107XG5cbmZ1bmN0aW9uIG9mZnNldEZyb20oYmFzZSwgcG9zKSB7XG4gIGlmIChwb3MucGF0aC5sZW5ndGggPiBiYXNlLnBhdGgubGVuZ3RoKSB7XG4gICAgdmFyIHBhdGggPSBbcG9zLnBhdGhbYmFzZS5wYXRoLmxlbmd0aF0gLSBiYXNlLm9mZnNldF07XG4gICAgZm9yICh2YXIgaSA9IGJhc2UucGF0aC5sZW5ndGggKyAxOyBpIDwgcG9zLnBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgIHBhdGgucHVzaChwb3MucGF0aFtpXSk7XG4gICAgfXJldHVybiBuZXcgX21vZGVsLlBvcyhwYXRoLCBwb3Mub2Zmc2V0KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IF9tb2RlbC5Qb3MoW10sIHBvcy5vZmZzZXQgLSBiYXNlLm9mZnNldCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFwVGhyb3VnaChtYXAsIHBvcywgYmlhcywgYmFjaykge1xuICBpZiAoYmlhcyA9PT0gdW5kZWZpbmVkKSBiaWFzID0gMTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcC5yZXBsYWNlZC5sZW5ndGg7IGkrKykge1xuICAgIHZhciByYW5nZSA9IG1hcC5yZXBsYWNlZFtpXSxcbiAgICAgICAgc2lkZSA9IGJhY2sgPyByYW5nZS5hZnRlciA6IHJhbmdlLmJlZm9yZTtcbiAgICB2YXIgbGVmdCA9IHVuZGVmaW5lZCxcbiAgICAgICAgcmlnaHQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKChsZWZ0ID0gcG9zLmNtcChzaWRlLmZyb20pKSA+PSAwICYmIChyaWdodCA9IHBvcy5jbXAoc2lkZS50bykpIDw9IDApIHtcbiAgICAgIHZhciBvdGhlciA9IGJhY2sgPyByYW5nZS5iZWZvcmUgOiByYW5nZS5hZnRlcjtcbiAgICAgIHJldHVybiBuZXcgTWFwUmVzdWx0KGJpYXMgPCAwID8gb3RoZXIuZnJvbSA6IG90aGVyLnRvLCAhIShsZWZ0ICYmIHJpZ2h0KSwgeyByYW5nZUlEOiBpLCBvZmZzZXQ6IG9mZnNldEZyb20oc2lkZS5yZWYsIHBvcykgfSk7XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXAubW92ZWQubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcmFuZ2UgPSBtYXAubW92ZWRbaV07XG4gICAgdmFyIHN0YXJ0ID0gYmFjayA/IHJhbmdlLmRlc3QgOiByYW5nZS5zdGFydDtcbiAgICBpZiAocG9zLmNtcChzdGFydCkgPj0gMCAmJiBfbW9kZWwuUG9zLmNtcChwb3MucGF0aCwgcG9zLm9mZnNldCwgc3RhcnQucGF0aCwgc3RhcnQub2Zmc2V0ICsgcmFuZ2Uuc2l6ZSkgPD0gMCkge1xuICAgICAgdmFyIGRlc3QgPSBiYWNrID8gcmFuZ2Uuc3RhcnQgOiByYW5nZS5kZXN0O1xuICAgICAgdmFyIGRlcHRoID0gc3RhcnQuZGVwdGg7XG4gICAgICBpZiAocG9zLmRlcHRoID4gZGVwdGgpIHtcbiAgICAgICAgdmFyIG9mZnNldCA9IGRlc3Qub2Zmc2V0ICsgKHBvcy5wYXRoW2RlcHRoXSAtIHN0YXJ0Lm9mZnNldCk7XG4gICAgICAgIHJldHVybiBuZXcgTWFwUmVzdWx0KG5ldyBfbW9kZWwuUG9zKGRlc3QucGF0aC5jb25jYXQob2Zmc2V0KS5jb25jYXQocG9zLnBhdGguc2xpY2UoZGVwdGggKyAxKSksIHBvcy5vZmZzZXQpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgTWFwUmVzdWx0KG5ldyBfbW9kZWwuUG9zKGRlc3QucGF0aCwgZGVzdC5vZmZzZXQgKyAocG9zLm9mZnNldCAtIHN0YXJ0Lm9mZnNldCkpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IE1hcFJlc3VsdChwb3MpO1xufVxuXG4vLyA7OyBBIHBvc2l0aW9uIG1hcCwgaG9sZGluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgd2F5IHBvc2l0aW9ucyBpblxuLy8gdGhlIHByZS1zdGVwIHZlcnNpb24gb2YgYSBkb2N1bWVudCBjb3JyZXNwb25kIHRvIHBvc2l0aW9ucyBpbiB0aGVcbi8vIHBvc3Qtc3RlcCB2ZXJzaW9uLiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYE1hcHBhYmxlYC5cblxudmFyIFBvc01hcCA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFBvc01hcChtb3ZlZCwgcmVwbGFjZWQpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUG9zTWFwKTtcblxuICAgIHRoaXMubW92ZWQgPSBtb3ZlZCB8fCBlbXB0eTtcbiAgICB0aGlzLnJlcGxhY2VkID0gcmVwbGFjZWQgfHwgZW1wdHk7XG4gIH1cblxuICAvLyA7OyAjdG9jPWZhbHNlIFRoZSByZXR1cm4gdmFsdWUgb2YgbWFwcGluZyBhIHBvc2l0aW9uLlxuXG4gIF9jcmVhdGVDbGFzcyhQb3NNYXAsIFt7XG4gICAga2V5OiBcInJlY292ZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVjb3ZlcihvZmZzZXQpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcGxhY2VkW29mZnNldC5yYW5nZUlEXS5hZnRlci5yZWYuZXh0ZW5kKG9mZnNldC5vZmZzZXQpO1xuICAgIH1cblxuICAgIC8vIDo6IChQb3MsID9udW1iZXIpIOKGkiBNYXBSZXN1bHRcbiAgICAvLyBNYXAgdGhlIGdpdmVuIHBvc2l0aW9uIHRocm91Z2ggdGhpcyBtYXAuIFRoZSBgYmlhc2AgcGFyYW1ldGVyIGNhblxuICAgIC8vIGJlIHVzZWQgdG8gY29udHJvbCB3aGF0IGhhcHBlbnMgd2hlbiB0aGUgdHJhbnNmb3JtIGluc2VydGVkXG4gICAgLy8gY29udGVudCBhdCAob3IgYXJvdW5kKSB0aGlzIHBvc2l0aW9u4oCUaWYgYGJpYXNgIGlzIG5lZ2F0aXZlLCB0aGUgYVxuICAgIC8vIHBvc2l0aW9uIGJlZm9yZSB0aGUgaW5zZXJ0ZWQgY29udGVudCB3aWxsIGJlIHJldHVybmVkLCBpZiBpdCBpc1xuICAgIC8vIHBvc2l0aXZlLCBhIHBvc2l0aW9uIGFmdGVyIHRoZSBpbnNlcnRpb24gaXMgcmV0dXJuZWQuXG4gIH0sIHtcbiAgICBrZXk6IFwibWFwXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1hcChwb3MsIGJpYXMpIHtcbiAgICAgIHJldHVybiBtYXBUaHJvdWdoKHRoaXMsIHBvcywgYmlhcywgZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIDo6ICgpIOKGkiBQb3NNYXBcbiAgICAvLyBDcmVhdGUgYW4gaW52ZXJ0ZWQgdmVyc2lvbiBvZiB0aGlzIG1hcC4gVGhlIHJlc3VsdCBjYW4gYmUgdXNlZCB0b1xuICAgIC8vIG1hcCBwb3NpdGlvbnMgaW4gdGhlIHBvc3Qtc3RlcCBkb2N1bWVudCB0byB0aGUgcHJlLXN0ZXAgZG9jdW1lbnQuXG4gIH0sIHtcbiAgICBrZXk6IFwiaW52ZXJ0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGludmVydCgpIHtcbiAgICAgIHJldHVybiBuZXcgSW52ZXJ0ZWRQb3NNYXAodGhpcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRvU3RyaW5nXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgcmV0dXJuIHRoaXMubW92ZWQuY29uY2F0KHRoaXMucmVwbGFjZWQpLmpvaW4oXCIgXCIpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBQb3NNYXA7XG59KSgpO1xuXG5leHBvcnRzLlBvc01hcCA9IFBvc01hcDtcblxudmFyIE1hcFJlc3VsdCA9IGZ1bmN0aW9uIE1hcFJlc3VsdChwb3MpIHtcbiAgdmFyIGRlbGV0ZWQgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IGFyZ3VtZW50c1sxXTtcbiAgdmFyIHJlY292ZXIgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDIgfHwgYXJndW1lbnRzWzJdID09PSB1bmRlZmluZWQgPyBudWxsIDogYXJndW1lbnRzWzJdO1xuXG4gIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBNYXBSZXN1bHQpO1xuXG4gIC8vIDo6IFBvcyBUaGUgbWFwcGVkIHZlcnNpb24gb2YgdGhlIHBvc2l0aW9uLlxuICB0aGlzLnBvcyA9IHBvcztcbiAgLy8gOjogYm9vbCBUZWxscyB5b3Ugd2hldGhlciB0aGUgcG9zaXRpb24gd2FzIGRlbGV0ZWQsIHRoYXQgaXMsXG4gIC8vIHdoZXRoZXIgdGhlIHN0ZXAgcmVtb3ZlZCBpdHMgc3Vycm91bmRpbmdzIGZyb20gdGhlIGRvY3VtZW50LlxuICB0aGlzLmRlbGV0ZWQgPSBkZWxldGVkO1xuICB0aGlzLnJlY292ZXIgPSByZWNvdmVyO1xufTtcblxuZXhwb3J0cy5NYXBSZXN1bHQgPSBNYXBSZXN1bHQ7XG5cbnZhciBJbnZlcnRlZFBvc01hcCA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEludmVydGVkUG9zTWFwKG1hcCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBJbnZlcnRlZFBvc01hcCk7XG5cbiAgICB0aGlzLmlubmVyID0gbWFwO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEludmVydGVkUG9zTWFwLCBbe1xuICAgIGtleTogXCJyZWNvdmVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlY292ZXIob2Zmc2V0KSB7XG4gICAgICByZXR1cm4gdGhpcy5pbm5lci5yZXBsYWNlZFtvZmZzZXQucmFuZ2VJRF0uYmVmb3JlLnJlZi5leHRlbmQob2Zmc2V0Lm9mZnNldCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm1hcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYXAocG9zLCBiaWFzKSB7XG4gICAgICByZXR1cm4gbWFwVGhyb3VnaCh0aGlzLmlubmVyLCBwb3MsIGJpYXMsIHRydWUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbnZlcnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW52ZXJ0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5uZXI7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRvU3RyaW5nXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgcmV0dXJuIFwiLVwiICsgdGhpcy5pbm5lcjtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gSW52ZXJ0ZWRQb3NNYXA7XG59KSgpO1xuXG52YXIgbnVsbE1hcCA9IG5ldyBQb3NNYXAoKTtcblxuZXhwb3J0cy5udWxsTWFwID0gbnVsbE1hcDtcbi8vIDs7IEEgcmVtYXBwaW5nIHJlcHJlc2VudHMgYSBwaXBlbGluZSBvZiB6ZXJvIG9yIG1vcmUgbWFwcGluZ3MuIEl0XG4vLyBpcyBhIHNwZWNpYWxpemVkIGRhdGEgc3RydWN0dXJlZCB1c2VkIHRvIG1hbmFnZSBtYXBwaW5nIHRocm91Z2ggYVxuLy8gc2VyaWVzIG9mIHN0ZXBzLCB0eXBpY2FsbHkgaW5jbHVkaW5nIGludmVydGVkIGFuZCBub24taW52ZXJ0ZWRcbi8vIHZlcnNpb25zIG9mIHRoZSBzYW1lIHN0ZXAuIChUaGlzIGNvbWVzIHVwIHdoZW4g4oCYcmViYXNpbmfigJkgc3RlcHMgZm9yXG4vLyBjb2xsYWJvcmF0aW9uIG9yIGhpc3RvcnkgbWFuYWdlbWVudC4pIFRoaXMgY2xhc3MgaW1wbGVtZW50c1xuLy8gYE1hcHBhYmxlYC5cblxudmFyIFJlbWFwcGluZyA9IChmdW5jdGlvbiAoKSB7XG4gIC8vIDo6ICg/W1Bvc01hcF0sID9bUG9zTWFwXSlcblxuICBmdW5jdGlvbiBSZW1hcHBpbmcoKSB7XG4gICAgdmFyIGhlYWQgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyBbXSA6IGFyZ3VtZW50c1swXTtcbiAgICB2YXIgdGFpbCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IFtdIDogYXJndW1lbnRzWzFdO1xuICAgIHZhciBtaXJyb3IgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDIgfHwgYXJndW1lbnRzWzJdID09PSB1bmRlZmluZWQgPyBPYmplY3QuY3JlYXRlKG51bGwpIDogYXJndW1lbnRzWzJdO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJlbWFwcGluZyk7XG5cbiAgICAvLyA6OiBbUG9zTWFwXVxuICAgIC8vIFRoZSBtYXBzIGluIHRoZSBoZWFkIG9mIHRoZSBtYXBwaW5nIGFyZSBhcHBsaWVkIHRvIGlucHV0XG4gICAgLy8gcG9zaXRpb25zIGZpcnN0LCBiYWNrLXRvLWZyb250LiBTbyB0aGUgbWFwIGF0IHRoZSBlbmQgb2YgdGhpc1xuICAgIC8vIGFycmF5IChpZiBhbnkpIGlzIHRoZSB2ZXJ5IGZpcnN0IG9uZSBhcHBsaWVkLlxuICAgIHRoaXMuaGVhZCA9IGhlYWQ7XG4gICAgLy8gVGhlIG1hcHMgaW4gdGhlIHRhaWwgYXJlIGFwcGxpZWQgbGFzdCwgZnJvbnQtdG8tYmFjay5cbiAgICB0aGlzLnRhaWwgPSB0YWlsO1xuICAgIHRoaXMubWlycm9yID0gbWlycm9yO1xuICB9XG5cbiAgLy8gOjogKFBvc01hcCwgP251bWJlcikg4oaSIG51bWJlclxuICAvLyBBZGQgYSBtYXAgdG8gdGhlIG1hcHBpbmcncyBmcm9udC4gSWYgdGhpcyBtYXAgaXMgdGhlIG1pcnJvciBpbWFnZVxuICAvLyAocHJvZHVjZWQgYnkgYW4gaW52ZXJ0ZWQgc3RlcCkgb2YgYW5vdGhlciBtYXAgaW4gdGhpcyBtYXBwaW5nLFxuICAvLyB0aGF0IG1hcCdzIGlkIChhcyByZXR1cm5lZCBieSB0aGlzIG1ldGhvZCBvclxuICAvLyBbYGFkZFRvQmFja2BdKCNSZW1hcHBpbmcuYWRkVG9CYWNrKSkgc2hvdWxkIGJlIHBhc3NlZCBhcyBhIHNlY29uZFxuICAvLyBwYXJhbWV0ZXIgdG8gcmVnaXN0ZXIgdGhlIGNvcnJlc3BvbmRlbmNlLlxuXG4gIF9jcmVhdGVDbGFzcyhSZW1hcHBpbmcsIFt7XG4gICAga2V5OiBcImFkZFRvRnJvbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkVG9Gcm9udChtYXAsIGNvcnIpIHtcbiAgICAgIHRoaXMuaGVhZC5wdXNoKG1hcCk7XG4gICAgICB2YXIgaWQgPSAtdGhpcy5oZWFkLmxlbmd0aDtcbiAgICAgIGlmIChjb3JyICE9IG51bGwpIHRoaXMubWlycm9yW2lkXSA9IGNvcnI7XG4gICAgICByZXR1cm4gaWQ7XG4gICAgfVxuXG4gICAgLy8gOjogKFBvc01hcCwgP251bWJlcikg4oaSIG51bWJlclxuICAgIC8vIEFkZCBhIG1hcCB0byB0aGUgbWFwcGluZydzIGJhY2suIElmIHRoZSBtYXAgaXMgdGhlIG1pcnJvciBpbWFnZVxuICAgIC8vIG9mIGFub3RoZXIgbWFwcGluZyBpbiB0aGlzIG9iamVjdCwgdGhlIGlkIG9mIHRoYXQgbWFwIHNob3VsZCBiZVxuICAgIC8vIHBhc3NlZCB0byByZWdpc3RlciB0aGUgY29ycmVzcG9uZGVuY2UuXG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkVG9CYWNrXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZFRvQmFjayhtYXAsIGNvcnIpIHtcbiAgICAgIHRoaXMudGFpbC5wdXNoKG1hcCk7XG4gICAgICB2YXIgaWQgPSB0aGlzLnRhaWwubGVuZ3RoIC0gMTtcbiAgICAgIGlmIChjb3JyICE9IG51bGwpIHRoaXMubWlycm9yW2NvcnJdID0gaWQ7XG4gICAgICByZXR1cm4gaWQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXQoaWQpIHtcbiAgICAgIHJldHVybiBpZCA8IDAgPyB0aGlzLmhlYWRbLWlkIC0gMV0gOiB0aGlzLnRhaWxbaWRdO1xuICAgIH1cblxuICAgIC8vIDo6IChQb3MsID9udW1iZXIpIOKGkiBNYXBSZXN1bHRcbiAgICAvLyBNYXAgYSBwb3NpdGlvbiB0aHJvdWdoIHRoaXMgcmVtYXBwaW5nLCBvcHRpb25hbGx5IHBhc3NpbmcgYSBiaWFzXG4gICAgLy8gZGlyZWN0aW9uLlxuICB9LCB7XG4gICAga2V5OiBcIm1hcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYXAocG9zLCBiaWFzKSB7XG4gICAgICB2YXIgZGVsZXRlZCA9IGZhbHNlO1xuXG4gICAgICBmb3IgKHZhciBpID0gLXRoaXMuaGVhZC5sZW5ndGg7IGkgPCB0aGlzLnRhaWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIG1hcCA9IHRoaXMuZ2V0KGkpO1xuICAgICAgICB2YXIgcmVzdWx0ID0gbWFwLm1hcChwb3MsIGJpYXMpO1xuICAgICAgICBpZiAocmVzdWx0LnJlY292ZXIpIHtcbiAgICAgICAgICB2YXIgY29yciA9IHRoaXMubWlycm9yW2ldO1xuICAgICAgICAgIGlmIChjb3JyICE9IG51bGwpIHtcbiAgICAgICAgICAgIGkgPSBjb3JyO1xuICAgICAgICAgICAgcG9zID0gdGhpcy5nZXQoY29ycikucmVjb3ZlcihyZXN1bHQucmVjb3Zlcik7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdC5kZWxldGVkKSBkZWxldGVkID0gdHJ1ZTtcbiAgICAgICAgcG9zID0gcmVzdWx0LnBvcztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBNYXBSZXN1bHQocG9zLCBkZWxldGVkKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUmVtYXBwaW5nO1xufSkoKTtcblxuZXhwb3J0cy5SZW1hcHBpbmcgPSBSZW1hcHBpbmc7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfbW9kZWwgPSByZXF1aXJlKFwiLi4vbW9kZWxcIik7XG5cbnZhciBfdHJhbnNmb3JtID0gcmVxdWlyZShcIi4vdHJhbnNmb3JtXCIpO1xuXG52YXIgX3N0ZXAgPSByZXF1aXJlKFwiLi9zdGVwXCIpO1xuXG52YXIgX3RyZWUgPSByZXF1aXJlKFwiLi90cmVlXCIpO1xuXG4vLyAhIVxuLy8gKipgYWRkTWFya2AqKlxuLy8gICA6IEFkZCB0aGUgYE1hcmtgIGdpdmVuIGFzIHRoZSBzdGVwJ3MgcGFyYW1ldGVyIHRvIGFsbFxuLy8gICAgIGlubGluZSBjb250ZW50IGJldHdlZW4gYGZyb21gIGFuZCBgdG9gICh3aGVuIGFsbG93ZWQpLlxuLy9cbi8vICoqYHJlbW92ZU1hcmtgKipcbi8vICAgOiBSZW1vdmUgdGhlIGBNYXJrYCBnaXZlbiBhcyB0aGUgc3RlcCdzIHBhcmFtZXRlciBmcm9tIGFsbCBpbmxpbmVcbi8vICAgICBjb250ZW50IGJldHdlZW4gYGZyb21gIGFuZCBgdG9gLlxuXG5fc3RlcC5TdGVwLmRlZmluZShcImFkZE1hcmtcIiwge1xuICBhcHBseTogZnVuY3Rpb24gYXBwbHkoZG9jLCBzdGVwKSB7XG4gICAgcmV0dXJuIG5ldyBfc3RlcC5TdGVwUmVzdWx0KCgwLCBfdHJlZS5jb3B5U3RydWN0dXJlKShkb2MsIHN0ZXAuZnJvbSwgc3RlcC50bywgZnVuY3Rpb24gKG5vZGUsIGZyb20sIHRvKSB7XG4gICAgICBpZiAoIW5vZGUudHlwZS5jYW5Db250YWluTWFyayhzdGVwLnBhcmFtKSkgcmV0dXJuIG5vZGU7XG4gICAgICByZXR1cm4gKDAsIF90cmVlLmNvcHlJbmxpbmUpKG5vZGUsIGZyb20sIHRvLCBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5tYXJrKHN0ZXAucGFyYW0uYWRkVG9TZXQobm9kZS5tYXJrcykpO1xuICAgICAgfSk7XG4gICAgfSkpO1xuICB9LFxuICBpbnZlcnQ6IGZ1bmN0aW9uIGludmVydChzdGVwLCBfb2xkRG9jLCBtYXApIHtcbiAgICByZXR1cm4gbmV3IF9zdGVwLlN0ZXAoXCJyZW1vdmVNYXJrXCIsIHN0ZXAuZnJvbSwgbWFwLm1hcChzdGVwLnRvKS5wb3MsIG51bGwsIHN0ZXAucGFyYW0pO1xuICB9LFxuICBwYXJhbVRvSlNPTjogZnVuY3Rpb24gcGFyYW1Ub0pTT04ocGFyYW0pIHtcbiAgICByZXR1cm4gcGFyYW0udG9KU09OKCk7XG4gIH0sXG4gIHBhcmFtRnJvbUpTT046IGZ1bmN0aW9uIHBhcmFtRnJvbUpTT04oc2NoZW1hLCBqc29uKSB7XG4gICAgcmV0dXJuIHNjaGVtYS5tYXJrRnJvbUpTT04oanNvbik7XG4gIH1cbn0pO1xuXG4vLyA6OiAoUG9zLCBQb3MsIE1hcmspIOKGkiBUcmFuc2Zvcm1cbi8vIEFkZCB0aGUgZ2l2ZW4gbWFyayB0byB0aGUgaW5saW5lIGNvbnRlbnQgYmV0d2VlbiBgZnJvbWAgYW5kIGB0b2AuXG5fdHJhbnNmb3JtLlRyYW5zZm9ybS5wcm90b3R5cGUuYWRkTWFyayA9IGZ1bmN0aW9uIChmcm9tLCB0bywgbWFyaykge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIHZhciByZW1vdmVkID0gW10sXG4gICAgICBhZGRlZCA9IFtdLFxuICAgICAgcmVtb3ZpbmcgPSBudWxsLFxuICAgICAgYWRkaW5nID0gbnVsbDtcbiAgdGhpcy5kb2MuaW5saW5lTm9kZXNCZXR3ZWVuKGZyb20sIHRvLCBmdW5jdGlvbiAoX3JlZiwgcGF0aCwgc3RhcnQsIGVuZCwgcGFyZW50KSB7XG4gICAgdmFyIG1hcmtzID0gX3JlZi5tYXJrcztcblxuICAgIGlmIChtYXJrLmlzSW5TZXQobWFya3MpIHx8ICFwYXJlbnQudHlwZS5jYW5Db250YWluTWFyayhtYXJrLnR5cGUpKSB7XG4gICAgICBhZGRpbmcgPSByZW1vdmluZyA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBybSA9IG1hcmsudHlwZS5pc0luU2V0KG1hcmtzKTtcbiAgICAgIGlmIChybSkge1xuICAgICAgICBpZiAocmVtb3ZpbmcgJiYgcmVtb3ZpbmcucGFyYW0uZXEocm0pKSB7XG4gICAgICAgICAgcmVtb3ZpbmcudG8gPSBuZXcgX21vZGVsLlBvcyhwYXRoLCBlbmQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlbW92aW5nID0gbmV3IF9zdGVwLlN0ZXAoXCJyZW1vdmVNYXJrXCIsIG5ldyBfbW9kZWwuUG9zKHBhdGgsIHN0YXJ0KSwgbmV3IF9tb2RlbC5Qb3MocGF0aCwgZW5kKSwgbnVsbCwgcm0pO1xuICAgICAgICAgIHJlbW92ZWQucHVzaChyZW1vdmluZyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocmVtb3ZpbmcpIHtcbiAgICAgICAgcmVtb3ZpbmcgPSBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKGFkZGluZykge1xuICAgICAgICBhZGRpbmcudG8gPSBuZXcgX21vZGVsLlBvcyhwYXRoLCBlbmQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWRkaW5nID0gbmV3IF9zdGVwLlN0ZXAoXCJhZGRNYXJrXCIsIG5ldyBfbW9kZWwuUG9zKHBhdGgsIHN0YXJ0KSwgbmV3IF9tb2RlbC5Qb3MocGF0aCwgZW5kKSwgbnVsbCwgbWFyayk7XG4gICAgICAgIGFkZGVkLnB1c2goYWRkaW5nKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICByZW1vdmVkLmZvckVhY2goZnVuY3Rpb24gKHMpIHtcbiAgICByZXR1cm4gX3RoaXMuc3RlcChzKTtcbiAgfSk7XG4gIGFkZGVkLmZvckVhY2goZnVuY3Rpb24gKHMpIHtcbiAgICByZXR1cm4gX3RoaXMuc3RlcChzKTtcbiAgfSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuX3N0ZXAuU3RlcC5kZWZpbmUoXCJyZW1vdmVNYXJrXCIsIHtcbiAgYXBwbHk6IGZ1bmN0aW9uIGFwcGx5KGRvYywgc3RlcCkge1xuICAgIHJldHVybiBuZXcgX3N0ZXAuU3RlcFJlc3VsdCgoMCwgX3RyZWUuY29weVN0cnVjdHVyZSkoZG9jLCBzdGVwLmZyb20sIHN0ZXAudG8sIGZ1bmN0aW9uIChub2RlLCBmcm9tLCB0bykge1xuICAgICAgcmV0dXJuICgwLCBfdHJlZS5jb3B5SW5saW5lKShub2RlLCBmcm9tLCB0bywgZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUubWFyayhzdGVwLnBhcmFtLnJlbW92ZUZyb21TZXQobm9kZS5tYXJrcykpO1xuICAgICAgfSk7XG4gICAgfSkpO1xuICB9LFxuICBpbnZlcnQ6IGZ1bmN0aW9uIGludmVydChzdGVwLCBfb2xkRG9jLCBtYXApIHtcbiAgICByZXR1cm4gbmV3IF9zdGVwLlN0ZXAoXCJhZGRNYXJrXCIsIHN0ZXAuZnJvbSwgbWFwLm1hcChzdGVwLnRvKS5wb3MsIG51bGwsIHN0ZXAucGFyYW0pO1xuICB9LFxuICBwYXJhbVRvSlNPTjogZnVuY3Rpb24gcGFyYW1Ub0pTT04ocGFyYW0pIHtcbiAgICByZXR1cm4gcGFyYW0udG9KU09OKCk7XG4gIH0sXG4gIHBhcmFtRnJvbUpTT046IGZ1bmN0aW9uIHBhcmFtRnJvbUpTT04oc2NoZW1hLCBqc29uKSB7XG4gICAgcmV0dXJuIHNjaGVtYS5tYXJrRnJvbUpTT04oanNvbik7XG4gIH1cbn0pO1xuXG4vLyA6OiAoUG9zLCBQb3MsIHVuaW9uPE1hcmssIE1hcmtUeXBlPikg4oaSIFRyYW5zZm9ybVxuLy8gUmVtb3ZlIHRoZSBnaXZlbiBtYXJrLCBvciBhbGwgbWFya3Mgb2YgdGhlIGdpdmVuIHR5cGUsIGZyb20gaW5saW5lXG4vLyBub2RlcyBiZXR3ZWVuIGBmcm9tYCBhbmQgYHRvYC5cbl90cmFuc2Zvcm0uVHJhbnNmb3JtLnByb3RvdHlwZS5yZW1vdmVNYXJrID0gZnVuY3Rpb24gKGZyb20sIHRvKSB7XG4gIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gIHZhciBtYXJrID0gYXJndW1lbnRzLmxlbmd0aCA8PSAyIHx8IGFyZ3VtZW50c1syXSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGFyZ3VtZW50c1syXTtcblxuICB2YXIgbWF0Y2hlZCA9IFtdLFxuICAgICAgc3RlcCA9IDA7XG4gIHRoaXMuZG9jLmlubGluZU5vZGVzQmV0d2Vlbihmcm9tLCB0bywgZnVuY3Rpb24gKF9yZWYyLCBwYXRoLCBzdGFydCwgZW5kKSB7XG4gICAgdmFyIG1hcmtzID0gX3JlZjIubWFya3M7XG5cbiAgICBzdGVwKys7XG4gICAgdmFyIHRvUmVtb3ZlID0gbnVsbDtcbiAgICBpZiAobWFyayBpbnN0YW5jZW9mIF9tb2RlbC5NYXJrVHlwZSkge1xuICAgICAgdmFyIGZvdW5kID0gbWFyay5pc0luU2V0KG1hcmtzKTtcbiAgICAgIGlmIChmb3VuZCkgdG9SZW1vdmUgPSBbZm91bmRdO1xuICAgIH0gZWxzZSBpZiAobWFyaykge1xuICAgICAgaWYgKG1hcmsuaXNJblNldChtYXJrcykpIHRvUmVtb3ZlID0gW21hcmtdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0b1JlbW92ZSA9IG1hcmtzO1xuICAgIH1cbiAgICBpZiAodG9SZW1vdmUgJiYgdG9SZW1vdmUubGVuZ3RoKSB7XG4gICAgICBwYXRoID0gcGF0aC5zbGljZSgpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b1JlbW92ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcm0gPSB0b1JlbW92ZVtpXSxcbiAgICAgICAgICAgIGZvdW5kID0gdW5kZWZpbmVkO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG1hdGNoZWQubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICB2YXIgbSA9IG1hdGNoZWRbal07XG4gICAgICAgICAgaWYgKG0uc3RlcCA9PSBzdGVwIC0gMSAmJiBybS5lcShtYXRjaGVkW2pdLnN0eWxlKSkgZm91bmQgPSBtO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgIGZvdW5kLnRvID0gbmV3IF9tb2RlbC5Qb3MocGF0aCwgZW5kKTtcbiAgICAgICAgICBmb3VuZC5zdGVwID0gc3RlcDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtYXRjaGVkLnB1c2goeyBzdHlsZTogcm0sIGZyb206IG5ldyBfbW9kZWwuUG9zKHBhdGgsIHN0YXJ0KSwgdG86IG5ldyBfbW9kZWwuUG9zKHBhdGgsIGVuZCksIHN0ZXA6IHN0ZXAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICBtYXRjaGVkLmZvckVhY2goZnVuY3Rpb24gKG0pIHtcbiAgICByZXR1cm4gX3RoaXMyLnN0ZXAoXCJyZW1vdmVNYXJrXCIsIG0uZnJvbSwgbS50bywgbnVsbCwgbS5zdHlsZSk7XG4gIH0pO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIDo6IChQb3MsIFBvcywgP05vZGVUeXBlKSDihpIgVHJhbnNmb3JtXG4vLyBSZW1vdmUgYWxsIG1hcmtzIGFuZCBub24tdGV4dCBpbmxpbmUgbm9kZXMsIG9yIGlmIGBuZXdQYXJlbnRgIGlzXG4vLyBnaXZlbiwgYWxsIG1hcmtzIGFuZCBpbmxpbmUgbm9kZXMgdGhhdCBtYXkgbm90IGFwcGVhciBhcyBjb250ZW50IG9mXG4vLyBgbmV3UGFyZW50YCwgZnJvbSB0aGUgZ2l2ZW4gcmFuZ2UuXG5fdHJhbnNmb3JtLlRyYW5zZm9ybS5wcm90b3R5cGUuY2xlYXJNYXJrdXAgPSBmdW5jdGlvbiAoZnJvbSwgdG8sIG5ld1BhcmVudCkge1xuICB2YXIgX3RoaXMzID0gdGhpcztcblxuICB2YXIgZGVsU3RlcHMgPSBbXTsgLy8gTXVzdCBiZSBhY2N1bXVsYXRlZCBhbmQgYXBwbGllZCBpbiBpbnZlcnNlIG9yZGVyXG4gIHRoaXMuZG9jLmlubGluZU5vZGVzQmV0d2Vlbihmcm9tLCB0bywgZnVuY3Rpb24gKF9yZWYzLCBwYXRoLCBzdGFydCwgZW5kKSB7XG4gICAgdmFyIG1hcmtzID0gX3JlZjMubWFya3M7XG4gICAgdmFyIHR5cGUgPSBfcmVmMy50eXBlO1xuXG4gICAgaWYgKG5ld1BhcmVudCA/ICFuZXdQYXJlbnQuY2FuQ29udGFpblR5cGUodHlwZSkgOiAhdHlwZS5pc1RleHQpIHtcbiAgICAgIHBhdGggPSBwYXRoLnNsaWNlKCk7XG4gICAgICB2YXIgX2Zyb20gPSBuZXcgX21vZGVsLlBvcyhwYXRoLCBzdGFydCk7XG4gICAgICBkZWxTdGVwcy5wdXNoKG5ldyBfc3RlcC5TdGVwKFwicmVwbGFjZVwiLCBfZnJvbSwgbmV3IF9tb2RlbC5Qb3MocGF0aCwgZW5kKSwgX2Zyb20pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXJrcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG1hcmsgPSBtYXJrc1tpXTtcbiAgICAgIGlmICghbmV3UGFyZW50IHx8ICFuZXdQYXJlbnQuY2FuQ29udGFpbk1hcmsobWFyay50eXBlKSkge1xuICAgICAgICBwYXRoID0gcGF0aC5zbGljZSgpO1xuICAgICAgICBfdGhpczMuc3RlcChcInJlbW92ZU1hcmtcIiwgbmV3IF9tb2RlbC5Qb3MocGF0aCwgc3RhcnQpLCBuZXcgX21vZGVsLlBvcyhwYXRoLCBlbmQpLCBudWxsLCBtYXJrKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICBmb3IgKHZhciBpID0gZGVsU3RlcHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICB0aGlzLnN0ZXAoZGVsU3RlcHNbaV0pO1xuICB9cmV0dXJuIHRoaXM7XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5yZXBsYWNlID0gcmVwbGFjZTtcblxudmFyIF9tb2RlbCA9IHJlcXVpcmUoXCIuLi9tb2RlbFwiKTtcblxudmFyIF90cmFuc2Zvcm0gPSByZXF1aXJlKFwiLi90cmFuc2Zvcm1cIik7XG5cbnZhciBfc3RlcCA9IHJlcXVpcmUoXCIuL3N0ZXBcIik7XG5cbnZhciBfbWFwID0gcmVxdWlyZShcIi4vbWFwXCIpO1xuXG52YXIgX3RyZWUgPSByZXF1aXJlKFwiLi90cmVlXCIpO1xuXG4vLyAhISAqKmByZXBsYWNlYCoqXG5cbi8vICAgOiBEZWxldGUgdGhlIHBhcnQgb2YgdGhlIGRvY3VtZW50IGJldHdlZW4gYGZyb21gIGFuZCBgdG9gIGFuZFxuLy8gICAgIG9wdGlvbmFsbHkgcmVwbGFjZSBpdCB3aXRoIGFub3RoZXIgY2h1bmsgb2YgY29udGVudC4gYHBvc2AgbXVzdFxuLy8gICAgIHBvaW50IGF0IHRoZSDigJhyb2904oCZIGF0IHdoaWNoIHRoZSBjdXQgc3RhcnRz4oCUYSBwb3NpdGlvbiBiZXR3ZWVuXG4vLyAgICAgYW5kIGFib3ZlIGBmcm9tYCBhbmQgYHRvYC5cbi8vXG4vLyAgICAgV2hlbiBuZXcgY29udGVudCBpcyB0byBiZSBpbnNlcnRlZCwgdGhlIHN0ZXAncyBwYXJhbWV0ZXIgc2hvdWxkXG4vLyAgICAgYmUgYW4gb2JqZWN0IG9mIHNoYXBlIGB7Y29udGVudDogYFtgRnJhZ21lbnRgXSgjRnJhZ21lbnQpYCxcbi8vICAgICBvcGVuTGVmdDogbnVtYmVyLCBvcGVuUmlnaHQ6IG51bWJlcn1gLiBUaGUgc3RlcCB3aWxsIGluc2VydCB0aGVcbi8vICAgICBnaXZlbiBjb250ZW50IGF0IHRoZSByb290IG9mIHRoZSBjdXQsIGFuZCBgb3BlbkxlZnRgIGFuZFxuLy8gICAgIGBvcGVuUmlnaHRgIGluZGljYXRlIGhvdyBtdWNoIG9mIHRoZSBjb250ZW50IG9uIGJvdGggc2lkZXNcbi8vICAgICBzaG91bGQgYmUgY29uc2lkZWQg4oCYb3BlbuKAmS5cbi8vXG4vLyAgICAgQSByZXBsYWNlIHN0ZXAgd2lsbCB0cnkgdG8gam9pbiBvcGVuIG5vZGVzIG9uIGJvdGggc2lkZXMgb2YgdGhlXG4vLyAgICAgY3V0LiBUaGF0IGlzLCBub2RlcyBpbiB0aGUgb3JpZ2luYWwgZG9jdW1lbnQgdGhhdCBhcmUgcGFydGlhbGx5XG4vLyAgICAgY3V0IG9mZiBieSBgZnJvbWAgYW5kIGB0b2AsIGFuZCBub2RlcyBhdCB0aGUgc2lkZXMgb2YgdGhlXG4vLyAgICAgcmVwbGFjZW1lbnQgY29udGVudCBhcyBzcGVjaWZpY2VkIGJ5IGBvcGVuTGVmdGAgYW5kXG4vLyAgICAgYG9wZW5SaWdodGAuIEZvciBleGFtcGxlLCBpZiBgb3BlbkxlZnRgIGlzIDIsIHRoZSBmaXJzdCBub2RlIG9mXG4vLyAgICAgdGhlIHJlcGxhY2VtZW50IGNvbnRlbnQgYXMgd2VsbCBhcyBpdHMgZmlyc3QgY2hpbGQgaXNcbi8vICAgICBjb25zaWRlcmVkIG9wZW4uIFdoZW5ldmVyIHR3byBvcGVuIG5vZGVzIHdpdGggdGhlIHNhbWVcbi8vICAgICBbbWFya3VwXSgjTm9kZS5zYW1lTWFya3VwKSBlbmQgdXAgbmV4dCB0byBlYWNoIG90aGVyLCB0aGV5IGFyZVxuLy8gICAgIGpvaW5lZC4gT3BlbiBub2RlcyB0aGF0IGFyZW4ndCBqb2luZWQgYXJlIFtjbG9zZWRdKCNOb2RlLmNsb3NlKVxuLy8gICAgIHRvIGVuc3VyZSB0aGVpciBjb250ZW50IChvciBsYWNrIG9mIGl0KSBpcyB2YWxpZC5cblxuZnVuY3Rpb24gZmluZE1vdmVkQ2h1bmtzKG9sZE5vZGUsIG9sZFBhdGgsIG5ld05vZGUsIHN0YXJ0RGVwdGgpIHtcbiAgdmFyIG1vdmVkID0gW107XG4gIHZhciBuZXdQYXRoID0gb2xkUGF0aC5wYXRoLnNsaWNlKDAsIHN0YXJ0RGVwdGgpO1xuXG4gIGZvciAodmFyIGRlcHRoID0gc3RhcnREZXB0aDs7IGRlcHRoKyspIHtcbiAgICB2YXIgam9pbmVkID0gZGVwdGggPT0gb2xkUGF0aC5kZXB0aCA/IDAgOiAxO1xuICAgIHZhciBjdXQgPSBkZXB0aCA9PSBvbGRQYXRoLmRlcHRoID8gb2xkUGF0aC5vZmZzZXQgOiBvbGRQYXRoLnBhdGhbZGVwdGhdO1xuICAgIHZhciBhZnRlckN1dCA9IG9sZE5vZGUuc2l6ZSAtIGN1dDtcbiAgICB2YXIgbmV3T2Zmc2V0ID0gbmV3Tm9kZS5zaXplIC0gYWZ0ZXJDdXQ7XG5cbiAgICB2YXIgZnJvbSA9IG9sZFBhdGguc2hvcnRlbihkZXB0aCwgam9pbmVkKTtcbiAgICB2YXIgdG8gPSBuZXcgX21vZGVsLlBvcyhuZXdQYXRoLCBuZXdPZmZzZXQgKyBqb2luZWQpO1xuICAgIGlmIChmcm9tLmNtcCh0bykpIG1vdmVkLnB1c2gobmV3IF9tYXAuTW92ZWRSYW5nZShmcm9tLCBhZnRlckN1dCAtIGpvaW5lZCwgdG8pKTtcblxuICAgIGlmICgham9pbmVkKSByZXR1cm4gbW92ZWQ7XG5cbiAgICBvbGROb2RlID0gb2xkTm9kZS5jaGlsZChjdXQpO1xuICAgIG5ld05vZGUgPSBuZXdOb2RlLmNoaWxkKG5ld09mZnNldCk7XG4gICAgbmV3UGF0aCA9IG5ld1BhdGguY29uY2F0KG5ld09mZnNldCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVwbGFjZShub2RlLCBmcm9tLCB0bywgcm9vdCwgcmVwbCkge1xuICB2YXIgZGVwdGggPSBhcmd1bWVudHMubGVuZ3RoIDw9IDUgfHwgYXJndW1lbnRzWzVdID09PSB1bmRlZmluZWQgPyAwIDogYXJndW1lbnRzWzVdO1xuXG4gIGlmIChkZXB0aCA9PSByb290Lmxlbmd0aCkge1xuICAgIHZhciBiZWZvcmUgPSBub2RlLnNsaWNlQmV0d2VlbihudWxsLCBmcm9tLCBkZXB0aCk7XG4gICAgdmFyIGFmdGVyID0gbm9kZS5zbGljZUJldHdlZW4odG8sIG51bGwsIGRlcHRoKSxcbiAgICAgICAgcmVzdWx0ID0gdW5kZWZpbmVkO1xuICAgIGlmICghYmVmb3JlLnR5cGUuY2FuQ29udGFpbkZyYWdtZW50KHJlcGwuY29udGVudCkpIHJldHVybiBudWxsO1xuICAgIGlmIChyZXBsLmNvbnRlbnQuc2l6ZSkgcmVzdWx0ID0gYmVmb3JlLmFwcGVuZChyZXBsLmNvbnRlbnQsIGZyb20uZGVwdGggLSBkZXB0aCwgcmVwbC5vcGVuTGVmdCkuYXBwZW5kKGFmdGVyLmNvbnRlbnQsIHJlcGwub3BlblJpZ2h0LCB0by5kZXB0aCAtIGRlcHRoKTtlbHNlIHJlc3VsdCA9IGJlZm9yZS5hcHBlbmQoYWZ0ZXIuY29udGVudCwgZnJvbS5kZXB0aCAtIGRlcHRoLCB0by5kZXB0aCAtIGRlcHRoKTtcbiAgICBpZiAoIXJlc3VsdC5zaXplICYmICFyZXN1bHQudHlwZS5jYW5CZUVtcHR5KSByZXN1bHQgPSByZXN1bHQuY29weShyZXN1bHQudHlwZS5kZWZhdWx0Q29udGVudCgpKTtcbiAgICByZXR1cm4geyBkb2M6IHJlc3VsdCwgbW92ZWQ6IGZpbmRNb3ZlZENodW5rcyhub2RlLCB0bywgcmVzdWx0LCBkZXB0aCkgfTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgcG9zID0gcm9vdFtkZXB0aF07XG4gICAgdmFyIHJlc3VsdCA9IHJlcGxhY2Uobm9kZS5jaGlsZChwb3MpLCBmcm9tLCB0bywgcm9vdCwgcmVwbCwgZGVwdGggKyAxKTtcbiAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHsgZG9jOiBub2RlLnJlcGxhY2UocG9zLCByZXN1bHQuZG9jKSwgbW92ZWQ6IHJlc3VsdC5tb3ZlZCB9O1xuICB9XG59XG5cbnZhciBudWxsUmVwbCA9IHsgY29udGVudDogX21vZGVsLmVtcHR5RnJhZ21lbnQsIG9wZW5MZWZ0OiAwLCBvcGVuUmlnaHQ6IDAgfTtcblxuX3N0ZXAuU3RlcC5kZWZpbmUoXCJyZXBsYWNlXCIsIHtcbiAgYXBwbHk6IGZ1bmN0aW9uIGFwcGx5KGRvYywgc3RlcCkge1xuICAgIHZhciByb290UG9zID0gc3RlcC5wb3MsXG4gICAgICAgIHJvb3QgPSByb290UG9zLnBhdGg7XG4gICAgaWYgKHN0ZXAuZnJvbS5kZXB0aCA8IHJvb3QubGVuZ3RoIHx8IHN0ZXAudG8uZGVwdGggPCByb290Lmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb290Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoc3RlcC5mcm9tLnBhdGhbaV0gIT0gcm9vdFtpXSB8fCBzdGVwLnRvLnBhdGhbaV0gIT0gcm9vdFtpXSkgcmV0dXJuIG51bGw7XG4gICAgfXZhciByZXN1bHQgPSByZXBsYWNlKGRvYywgc3RlcC5mcm9tLCBzdGVwLnRvLCByb290UG9zLnBhdGgsIHN0ZXAucGFyYW0gfHwgbnVsbFJlcGwpO1xuICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICB2YXIgb3V0ID0gcmVzdWx0LmRvYztcbiAgICB2YXIgbW92ZWQgPSByZXN1bHQubW92ZWQ7XG5cbiAgICB2YXIgZW5kID0gbW92ZWQubGVuZ3RoID8gbW92ZWRbbW92ZWQubGVuZ3RoIC0gMV0uZGVzdCA6IHN0ZXAudG87XG4gICAgdmFyIHJlcGxhY2VkID0gbmV3IF9tYXAuUmVwbGFjZWRSYW5nZShzdGVwLmZyb20sIHN0ZXAudG8sIHN0ZXAuZnJvbSwgZW5kLCByb290UG9zLCByb290UG9zKTtcbiAgICByZXR1cm4gbmV3IF9zdGVwLlN0ZXBSZXN1bHQob3V0LCBuZXcgX21hcC5Qb3NNYXAobW92ZWQsIFtyZXBsYWNlZF0pKTtcbiAgfSxcbiAgaW52ZXJ0OiBmdW5jdGlvbiBpbnZlcnQoc3RlcCwgb2xkRG9jLCBtYXApIHtcbiAgICB2YXIgZGVwdGggPSBzdGVwLnBvcy5kZXB0aDtcbiAgICByZXR1cm4gbmV3IF9zdGVwLlN0ZXAoXCJyZXBsYWNlXCIsIHN0ZXAuZnJvbSwgbWFwLm1hcChzdGVwLnRvKS5wb3MsIHN0ZXAuZnJvbS5zaG9ydGVuKGRlcHRoKSwge1xuICAgICAgY29udGVudDogb2xkRG9jLnBhdGgoc3RlcC5wb3MucGF0aCkuY29udGVudC5zbGljZUJldHdlZW4oc3RlcC5mcm9tLCBzdGVwLnRvLCBkZXB0aCksXG4gICAgICBvcGVuTGVmdDogc3RlcC5mcm9tLmRlcHRoIC0gZGVwdGgsXG4gICAgICBvcGVuUmlnaHQ6IHN0ZXAudG8uZGVwdGggLSBkZXB0aFxuICAgIH0pO1xuICB9LFxuICBwYXJhbVRvSlNPTjogZnVuY3Rpb24gcGFyYW1Ub0pTT04ocGFyYW0pIHtcbiAgICByZXR1cm4gcGFyYW0gJiYgeyBjb250ZW50OiBwYXJhbS5jb250ZW50LnNpemUgJiYgcGFyYW0uY29udGVudC50b0pTT04oKSxcbiAgICAgIG9wZW5MZWZ0OiBwYXJhbS5vcGVuTGVmdCwgb3BlblJpZ2h0OiBwYXJhbS5vcGVuUmlnaHQgfTtcbiAgfSxcbiAgcGFyYW1Gcm9tSlNPTjogZnVuY3Rpb24gcGFyYW1Gcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICByZXR1cm4ganNvbiAmJiB7IGNvbnRlbnQ6IF9tb2RlbC5GcmFnbWVudC5mcm9tSlNPTihzY2hlbWEsIGpzb24uY29udGVudCksXG4gICAgICBvcGVuTGVmdDoganNvbi5vcGVuTGVmdCwgb3BlblJpZ2h0OiBqc29uLm9wZW5SaWdodCB9O1xuICB9XG59KTtcblxuZnVuY3Rpb24gc2hpZnRGcm9tU3RhY2soc3RhY2ssIGRlcHRoKSB7XG4gIHZhciBzaGlmdGVkID0gc3RhY2tbZGVwdGhdID0gc3RhY2tbZGVwdGhdLnNwbGljZSgwLCAxLCBfbW9kZWwuZW1wdHlGcmFnbWVudCk7XG4gIGZvciAodmFyIGkgPSBkZXB0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgc2hpZnRlZCA9IHN0YWNrW2ldID0gc3RhY2tbaV0ucmVwbGFjZSgwLCBzaGlmdGVkKTtcbiAgfVxufVxuXG4vLyBGSVhNRSBmaW5kIGEgbm90IHNvIGhvcnJpYmx5IGNvbmZ1c2luZyB3YXkgdG8gZXhwcmVzcyB0aGlzXG5mdW5jdGlvbiBidWlsZEluc2VydGVkKG5vZGVzTGVmdCwgc291cmNlLCBzdGFydCwgZW5kKSB7XG4gIHZhciBzbGljZWQgPSBzb3VyY2Uuc2xpY2VCZXR3ZWVuKHN0YXJ0LCBlbmQpO1xuICB2YXIgbm9kZXNSaWdodCA9IFtdO1xuICBmb3IgKHZhciBub2RlID0gc2xpY2VkLCBpID0gMDsgaSA8PSBzdGFydC5wYXRoLmxlbmd0aDsgaSsrLCBub2RlID0gbm9kZS5maXJzdENoaWxkKSB7XG4gICAgbm9kZXNSaWdodC5wdXNoKG5vZGUpO1xuICB9dmFyIHNhbWUgPSAoMCwgX3RyZWUuc2FtZVBhdGhEZXB0aCkoc3RhcnQsIGVuZCk7XG4gIHZhciBzZWFyY2hMZWZ0ID0gbm9kZXNMZWZ0Lmxlbmd0aCAtIDEsXG4gICAgICBzZWFyY2hSaWdodCA9IG5vZGVzUmlnaHQubGVuZ3RoIC0gMTtcbiAgdmFyIHJlc3VsdCA9IG51bGw7XG5cbiAgdmFyIGlubmVyID0gbm9kZXNSaWdodFtzZWFyY2hSaWdodF07XG4gIGlmIChpbm5lci5pc1RleHRibG9jayAmJiBpbm5lci5zaXplICYmIG5vZGVzTGVmdFtzZWFyY2hMZWZ0XS5pc1RleHRibG9jaykge1xuICAgIHJlc3VsdCA9IG5vZGVzTGVmdFtzZWFyY2hMZWZ0LS1dLmNvcHkoaW5uZXIuY29udGVudCk7XG4gICAgLS1zZWFyY2hSaWdodDtcbiAgICBzaGlmdEZyb21TdGFjayhub2Rlc1JpZ2h0LCBzZWFyY2hSaWdodCk7XG4gIH1cblxuICBmb3IgKDs7KSB7XG4gICAgdmFyIG5vZGUgPSBub2Rlc1JpZ2h0W3NlYXJjaFJpZ2h0XSxcbiAgICAgICAgdHlwZSA9IG5vZGUudHlwZSxcbiAgICAgICAgbWF0Y2hlZCA9IG51bGw7XG4gICAgdmFyIG91dHNpZGUgPSBzZWFyY2hSaWdodCA8PSBzYW1lO1xuICAgIGZvciAodmFyIGkgPSBzZWFyY2hMZWZ0OyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGxlZnQgPSBub2Rlc0xlZnRbaV07XG4gICAgICBpZiAob3V0c2lkZSA/IGxlZnQudHlwZS5jYW5Db250YWluQ29udGVudChub2RlLnR5cGUpIDogbGVmdC50eXBlID09IHR5cGUpIHtcbiAgICAgICAgbWF0Y2hlZCA9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobWF0Y2hlZCAhPSBudWxsKSB7XG4gICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICByZXN1bHQgPSBub2Rlc0xlZnRbbWF0Y2hlZF0uY29weShub2RlLmNvbnRlbnQpO1xuICAgICAgICBzZWFyY2hMZWZ0ID0gbWF0Y2hlZCAtIDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aGlsZSAoc2VhcmNoTGVmdCA+PSBtYXRjaGVkKSB7XG4gICAgICAgICAgdmFyIHdyYXAgPSBub2Rlc0xlZnRbc2VhcmNoTGVmdF07XG4gICAgICAgICAgdmFyIGNvbnRlbnQgPSBfbW9kZWwuRnJhZ21lbnQuZnJvbShyZXN1bHQpO1xuICAgICAgICAgIHJlc3VsdCA9IHdyYXAuY29weShzZWFyY2hMZWZ0ID09IG1hdGNoZWQgPyBjb250ZW50LmFwcGVuZChub2RlLmNvbnRlbnQpIDogY29udGVudCk7XG4gICAgICAgICAgc2VhcmNoTGVmdC0tO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChtYXRjaGVkICE9IG51bGwgfHwgbm9kZS5zaXplID09IDApIHtcbiAgICAgIGlmIChvdXRzaWRlKSBicmVhaztcbiAgICAgIGlmIChzZWFyY2hSaWdodCkgc2hpZnRGcm9tU3RhY2sobm9kZXNSaWdodCwgc2VhcmNoUmlnaHQgLSAxKTtcbiAgICB9XG4gICAgc2VhcmNoUmlnaHQtLTtcbiAgfVxuXG4gIHZhciByZXBsID0geyBjb250ZW50OiByZXN1bHQgPyByZXN1bHQuY29udGVudCA6IF9tb2RlbC5lbXB0eUZyYWdtZW50LFxuICAgIG9wZW5MZWZ0OiBzdGFydC5kZXB0aCAtIHNlYXJjaFJpZ2h0LFxuICAgIG9wZW5SaWdodDogZW5kLmRlcHRoIC0gc2VhcmNoUmlnaHQgfTtcbiAgcmV0dXJuIHsgcmVwbDogcmVwbCwgZGVwdGg6IHNlYXJjaExlZnQgKyAxIH07XG59XG5cbmZ1bmN0aW9uIG1vdmVUZXh0KHRyLCBkb2MsIGJlZm9yZSwgYWZ0ZXIpIHtcbiAgdmFyIHJvb3QgPSAoMCwgX3RyZWUuc2FtZVBhdGhEZXB0aCkoYmVmb3JlLCBhZnRlcik7XG4gIHZhciBjdXRBdCA9IGFmdGVyLnNob3J0ZW4obnVsbCwgMSk7XG4gIHdoaWxlIChjdXRBdC5wYXRoLmxlbmd0aCA+IHJvb3QgJiYgZG9jLnBhdGgoY3V0QXQucGF0aCkuc2l6ZSA9PSAxKSBjdXRBdCA9IGN1dEF0LnNob3J0ZW4obnVsbCwgMSk7XG4gIHRyLnNwbGl0KGN1dEF0LCBjdXRBdC5wYXRoLmxlbmd0aCAtIHJvb3QpO1xuICB2YXIgc3RhcnQgPSBhZnRlcixcbiAgICAgIGVuZCA9IG5ldyBfbW9kZWwuUG9zKHN0YXJ0LnBhdGgsIGRvYy5wYXRoKHN0YXJ0LnBhdGgpLnNpemUpO1xuICB2YXIgcGFyZW50ID0gZG9jLnBhdGgoc3RhcnQucGF0aC5zbGljZSgwLCByb290KSk7XG4gIHZhciB3YW50ZWQgPSBwYXJlbnQucGF0aE5vZGVzKGJlZm9yZS5wYXRoLnNsaWNlKHJvb3QpKTtcbiAgdmFyIGV4aXN0aW5nID0gcGFyZW50LnBhdGhOb2RlcyhzdGFydC5wYXRoLnNsaWNlKHJvb3QpKTtcbiAgd2hpbGUgKHdhbnRlZC5sZW5ndGggJiYgZXhpc3RpbmcubGVuZ3RoICYmIHdhbnRlZFswXS5zYW1lTWFya3VwKGV4aXN0aW5nWzBdKSkge1xuICAgIHdhbnRlZC5zaGlmdCgpO1xuICAgIGV4aXN0aW5nLnNoaWZ0KCk7XG4gIH1cbiAgaWYgKGV4aXN0aW5nLmxlbmd0aCB8fCB3YW50ZWQubGVuZ3RoKSB0ci5zdGVwKFwiYW5jZXN0b3JcIiwgc3RhcnQsIGVuZCwgbnVsbCwge1xuICAgIGRlcHRoOiBleGlzdGluZy5sZW5ndGgsXG4gICAgdHlwZXM6IHdhbnRlZC5tYXAoZnVuY3Rpb24gKG4pIHtcbiAgICAgIHJldHVybiBuLnR5cGU7XG4gICAgfSksXG4gICAgYXR0cnM6IHdhbnRlZC5tYXAoZnVuY3Rpb24gKG4pIHtcbiAgICAgIHJldHVybiBuLmF0dHJzO1xuICAgIH0pXG4gIH0pO1xuICBmb3IgKHZhciBpID0gcm9vdDsgaSA8IGJlZm9yZS5wYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgdHIuam9pbihiZWZvcmUuc2hvcnRlbihpLCAxKSk7XG4gIH1cbn1cblxuLy8gOjogKFBvcywgUG9zKSDihpIgVHJhbnNmb3JtXG4vLyBEZWxldGUgdGhlIGNvbnRlbnQgYmV0d2VlbiB0aGUgZ2l2ZW4gcG9zaXRpb25zLlxuX3RyYW5zZm9ybS5UcmFuc2Zvcm0ucHJvdG90eXBlW1wiZGVsZXRlXCJdID0gZnVuY3Rpb24gKGZyb20sIHRvKSB7XG4gIGlmIChmcm9tLmNtcCh0bykpIHRoaXMucmVwbGFjZShmcm9tLCB0byk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gOjogKFBvcywgUG9zLCBOb2RlLCBQb3MsIFBvcykg4oaSIFRyYW5zZm9ybVxuLy8gUmVwbGFjZSB0aGUgcGFydCBvZiB0aGUgZG9jdW1lbnQgYmV0d2VlbiBgZnJvbWAgYW5kIGB0b2Agd2l0aCB0aGVcbi8vIHBhcnQgb2YgdGhlIGBzb3VyY2VgIGJldHdlZW4gYHN0YXJ0YCBhbmQgYGVuZGAuXG5fdHJhbnNmb3JtLlRyYW5zZm9ybS5wcm90b3R5cGUucmVwbGFjZSA9IGZ1bmN0aW9uIChmcm9tLCB0bywgc291cmNlLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXBsID0gdW5kZWZpbmVkLFxuICAgICAgZGVwdGggPSB1bmRlZmluZWQsXG4gICAgICBkb2MgPSB0aGlzLmRvYyxcbiAgICAgIG1heERlcHRoID0gKDAsIF90cmVlLnNhbWVQYXRoRGVwdGgpKGZyb20sIHRvKTtcbiAgaWYgKHNvdXJjZSkge1xuICAgIDtcbiAgICB2YXIgX2J1aWxkSW5zZXJ0ZWQgPSBidWlsZEluc2VydGVkKGRvYy5wYXRoTm9kZXMoZnJvbS5wYXRoKSwgc291cmNlLCBzdGFydCwgZW5kKTtcblxuICAgIHJlcGwgPSBfYnVpbGRJbnNlcnRlZC5yZXBsO1xuICAgIGRlcHRoID0gX2J1aWxkSW5zZXJ0ZWQuZGVwdGg7XG5cbiAgICB3aGlsZSAoZGVwdGggPiBtYXhEZXB0aCkge1xuICAgICAgaWYgKHJlcGwuY29udGVudC5zaXplKSByZXBsID0geyBjb250ZW50OiBfbW9kZWwuRnJhZ21lbnQuZnJvbShkb2MucGF0aChmcm9tLnBhdGguc2xpY2UoMCwgZGVwdGgpKS5jb3B5KHJlcGwuY29udGVudCkpLFxuICAgICAgICBvcGVuTGVmdDogcmVwbC5vcGVuTGVmdCArIDEsIG9wZW5SaWdodDogcmVwbC5vcGVuUmlnaHQgKyAxIH07XG4gICAgICBkZXB0aC0tO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXBsID0gbnVsbFJlcGw7XG4gICAgZGVwdGggPSBtYXhEZXB0aDtcbiAgfVxuICB2YXIgcm9vdCA9IGZyb20uc2hvcnRlbihkZXB0aCksXG4gICAgICBkb2NBZnRlciA9IGRvYyxcbiAgICAgIGFmdGVyID0gdG87XG4gIGlmIChyZXBsLmNvbnRlbnQuc2l6ZSB8fCAoMCwgX3RyZWUucmVwbGFjZUhhc0VmZmVjdCkoZG9jLCBmcm9tLCB0bykpIHtcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5zdGVwKFwicmVwbGFjZVwiLCBmcm9tLCB0bywgcm9vdCwgcmVwbCk7XG4gICAgZG9jQWZ0ZXIgPSByZXN1bHQuZG9jO1xuICAgIGFmdGVyID0gcmVzdWx0Lm1hcC5tYXAodG8pLnBvcztcbiAgfVxuXG4gIC8vIElmIG5vIHRleHQgbm9kZXMgYmVmb3JlIG9yIGFmdGVyIGVuZCBvZiByZXBsYWNlbWVudCwgZG9uJ3QgZ2x1ZSB0ZXh0XG4gIGlmICghZG9jLnBhdGgodG8ucGF0aCkuaXNUZXh0YmxvY2spIHJldHVybiB0aGlzO1xuICBpZiAoIShyZXBsLmNvbnRlbnQuc2l6ZSA/IHNvdXJjZS5wYXRoKGVuZC5wYXRoKS5pc1RleHRibG9jayA6IGRvYy5wYXRoKGZyb20ucGF0aCkuaXNUZXh0YmxvY2spKSByZXR1cm4gdGhpcztcblxuICB2YXIgbm9kZXNBZnRlciA9IGRvYy5wYXRoKHJvb3QucGF0aCkucGF0aE5vZGVzKHRvLnBhdGguc2xpY2UoZGVwdGgpKS5zbGljZSgxKTtcbiAgdmFyIG5vZGVzQmVmb3JlID0gdW5kZWZpbmVkO1xuICBpZiAocmVwbC5jb250ZW50LnNpemUpIHtcbiAgICB2YXIgaW5zZXJ0ZWQgPSByZXBsLmNvbnRlbnQ7XG4gICAgbm9kZXNCZWZvcmUgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcGwub3BlblJpZ2h0OyBpKyspIHtcbiAgICAgIHZhciBsYXN0ID0gaW5zZXJ0ZWQuY2hpbGQoaW5zZXJ0ZWQuc2l6ZSAtIDEpO1xuICAgICAgbm9kZXNCZWZvcmUucHVzaChsYXN0KTtcbiAgICAgIGluc2VydGVkID0gbGFzdC5jb250ZW50O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBub2Rlc0JlZm9yZSA9IGRvYy5wYXRoKHJvb3QucGF0aCkucGF0aE5vZGVzKGZyb20ucGF0aC5zbGljZShkZXB0aCkpLnNsaWNlKDEpO1xuICB9XG5cbiAgaWYgKG5vZGVzQmVmb3JlLmxlbmd0aCAmJiAobm9kZXNBZnRlci5sZW5ndGggIT0gbm9kZXNCZWZvcmUubGVuZ3RoIHx8ICFub2Rlc0FmdGVyLmV2ZXJ5KGZ1bmN0aW9uIChuLCBpKSB7XG4gICAgcmV0dXJuIG4uc2FtZU1hcmt1cChub2Rlc0JlZm9yZVtpXSk7XG4gIH0pKSkge1xuICAgIHZhciBfYWZ0ZXIkc2hvcnRlbiA9IGFmdGVyLnNob3J0ZW4ocm9vdC5kZXB0aCk7XG5cbiAgICB2YXIgcGF0aCA9IF9hZnRlciRzaG9ydGVuLnBhdGg7XG4gICAgdmFyIG9mZnNldCA9IF9hZnRlciRzaG9ydGVuLm9mZnNldDt2YXIgYmVmb3JlID0gdW5kZWZpbmVkO1xuICAgIGZvciAodmFyIG5vZGUgPSBkb2NBZnRlci5wYXRoKHBhdGgpLCBpID0gMDs7IGkrKykge1xuICAgICAgaWYgKGkgPT0gbm9kZXNCZWZvcmUubGVuZ3RoKSB7XG4gICAgICAgIGJlZm9yZSA9IG5ldyBfbW9kZWwuUG9zKHBhdGgsIG9mZnNldCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgcGF0aC5wdXNoKG9mZnNldCAtIDEpO1xuICAgICAgbm9kZSA9IG5vZGUuY2hpbGQob2Zmc2V0IC0gMSk7XG4gICAgICBvZmZzZXQgPSBub2RlLnNpemU7XG4gICAgfVxuICAgIG1vdmVUZXh0KHRoaXMsIGRvY0FmdGVyLCBiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIDo6IChQb3MsIFBvcywgdW5pb248RnJhZ21lbnQsIE5vZGUsIFtOb2RlXT4pIOKGkiBUcmFuc2Zvcm1cbi8vIFJlcGxhY2UgdGhlIGdpdmVuIHNpYmxpbmcgcmFuZ2UgKHBvc2l0aW9uIHBvbnRpbmcgaW50byB0aGUgc2FtZVxuLy8gcGFyZW50KSB3aXRoIHRoZSBnaXZlbiBjb250ZW50LCB3aGljaCBtYXkgYmUgYSBmcmFnbWVudCwgbm9kZSwgb3Jcbi8vIGFycmF5IG9mIG5vZGVzLlxuX3RyYW5zZm9ybS5UcmFuc2Zvcm0ucHJvdG90eXBlLnJlcGxhY2VXaXRoID0gZnVuY3Rpb24gKGZyb20sIHRvLCBjb250ZW50KSB7XG4gIGlmICghKGNvbnRlbnQgaW5zdGFuY2VvZiBfbW9kZWwuRnJhZ21lbnQpKSBjb250ZW50ID0gX21vZGVsLkZyYWdtZW50LmZyb20oY29udGVudCk7XG4gIGlmICghX21vZGVsLlBvcy5zYW1lUGF0aChmcm9tLnBhdGgsIHRvLnBhdGgpKSByZXR1cm4gdGhpcztcbiAgdGhpcy5zdGVwKFwicmVwbGFjZVwiLCBmcm9tLCB0bywgZnJvbSwgeyBjb250ZW50OiBjb250ZW50LCBvcGVuTGVmdDogMCwgb3BlblJpZ2h0OiAwIH0pO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIDo6IChQb3MsIHVuaW9uPEZyYWdtZW50LCBOb2RlLCBbTm9kZV0+KSDihpIgVHJhbnNmb3JtXG4vLyBJbnNlcnQgdGhlIGdpdmVuIGNvbnRlbnQgYXQgdGhlIGBwb3NgLlxuX3RyYW5zZm9ybS5UcmFuc2Zvcm0ucHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uIChwb3MsIGNvbnRlbnQpIHtcbiAgcmV0dXJuIHRoaXMucmVwbGFjZVdpdGgocG9zLCBwb3MsIGNvbnRlbnQpO1xufTtcblxuLy8gOjogKFBvcywgc3RyaW5nKSDihpIgVHJhbnNmb3JtXG4vLyBJbnNlcnQgdGhlIGdpdmVuIHRleHQgYXQgYHBvc2AsIGluaGVyaXRpbmcgdGhlIG1hcmtzIG9mIHRoZVxuLy8gZXhpc3RpbmcgY29udGVudCBhdCB0aGF0IHBvc2l0aW9uLlxuX3RyYW5zZm9ybS5UcmFuc2Zvcm0ucHJvdG90eXBlLmluc2VydFRleHQgPSBmdW5jdGlvbiAocG9zLCB0ZXh0KSB7XG4gIHJldHVybiB0aGlzLmluc2VydChwb3MsIHRoaXMuZG9jLnR5cGUuc2NoZW1hLnRleHQodGV4dCwgdGhpcy5kb2MubWFya3NBdChwb3MpKSk7XG59O1xuXG4vLyA6OiAoUG9zLCBOb2RlKSDihpIgVHJhbnNmb3JtXG4vLyBJbnNlcnQgdGhlIGdpdmVuIG5vZGUgYXQgYHBvc2AsIGluaGVyaXRpbmcgdGhlIG1hcmtzIG9mIHRoZVxuLy8gZXhpc3RpbmcgY29udGVudCBhdCB0aGF0IHBvc2l0aW9uLlxuX3RyYW5zZm9ybS5UcmFuc2Zvcm0ucHJvdG90eXBlLmluc2VydElubGluZSA9IGZ1bmN0aW9uIChwb3MsIG5vZGUpIHtcbiAgcmV0dXJuIHRoaXMuaW5zZXJ0KHBvcywgbm9kZS5tYXJrKHRoaXMuZG9jLm1hcmtzQXQocG9zKSkpO1xufTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9tb2RlbCA9IHJlcXVpcmUoXCIuLi9tb2RlbFwiKTtcblxudmFyIF90cmFuc2Zvcm0gPSByZXF1aXJlKFwiLi90cmFuc2Zvcm1cIik7XG5cbnZhciBfc3RlcCA9IHJlcXVpcmUoXCIuL3N0ZXBcIik7XG5cbnZhciBfbWFwID0gcmVxdWlyZShcIi4vbWFwXCIpO1xuXG4vLyAhISAqKmBzcGxpdGAqKlxuLy8gICA6IFNwbGl0IGEgYmxvY2sgbm9kZSBhdCBgcG9zYC4gVGhlIHBhcmFtZXRlciwgaWYgZ2l2ZW4sIG1heSBiZVxuLy8gICAgIGB7dHlwZSwgP2F0dHJzfWAgb2JqZWN0IGdpdmluZyB0aGUgbm9kZSB0eXBlIGFuZCBvcHRpb25hbGx5IHRoZVxuLy8gICAgIGF0dHJpYnV0ZXMgb2YgdGhlIG5vZGUgY3JlYXRlZCB0byBob2xkIHRoZSBjb250ZW50IGFmdGVyIHRoZVxuLy8gICAgIHNwbGl0LlxuXG5fc3RlcC5TdGVwLmRlZmluZShcInNwbGl0XCIsIHtcbiAgYXBwbHk6IGZ1bmN0aW9uIGFwcGx5KGRvYywgc3RlcCkge1xuICAgIHZhciBwb3MgPSBzdGVwLnBvcztcbiAgICBpZiAocG9zLmRlcHRoID09IDApIHJldHVybiBudWxsO1xuXG4gICAgdmFyIF9wb3Mkc2hvcnRlbiA9IHBvcy5zaG9ydGVuKCk7XG5cbiAgICB2YXIgcGFyZW50UGF0aCA9IF9wb3Mkc2hvcnRlbi5wYXRoO1xuICAgIHZhciBvZmZzZXQgPSBfcG9zJHNob3J0ZW4ub2Zmc2V0O1xuXG4gICAgdmFyIHBhcmVudCA9IGRvYy5wYXRoKHBhcmVudFBhdGgpO1xuICAgIHZhciB0YXJnZXQgPSBwYXJlbnQuY2hpbGQob2Zmc2V0KSxcbiAgICAgICAgdGFyZ2V0U2l6ZSA9IHRhcmdldC5zaXplO1xuXG4gICAgdmFyIF9yZWYgPSBzdGVwLnBhcmFtIHx8IHRhcmdldDtcblxuICAgIHZhciB0eXBlQWZ0ZXIgPSBfcmVmLnR5cGU7XG4gICAgdmFyIGF0dHJzQWZ0ZXIgPSBfcmVmLmF0dHJzO1xuXG4gICAgdmFyIHNwbGl0QXQgPSBwb3Mub2Zmc2V0O1xuICAgIGlmIChzcGxpdEF0ID09IDAgJiYgIXRhcmdldC50eXBlLmNhbkJlRW1wdHkgfHwgdGFyZ2V0LnR5cGUubG9ja2VkIHx8IHNwbGl0QXQgPT0gdGFyZ2V0LnNpemUgJiYgIXR5cGVBZnRlci5jYW5CZUVtcHR5KSByZXR1cm4gbnVsbDtcbiAgICB2YXIgbmV3UGFyZW50ID0gcGFyZW50LnNwbGljZShvZmZzZXQsIG9mZnNldCArIDEsIF9tb2RlbC5GcmFnbWVudC5mcm9tKFt0YXJnZXQuc2xpY2UoMCwgc3BsaXRBdCksIHR5cGVBZnRlci5jcmVhdGUoYXR0cnNBZnRlciwgdGFyZ2V0LmNvbnRlbnQuc2xpY2Uoc3BsaXRBdCkpXSkpO1xuICAgIHZhciBjb3B5ID0gZG9jLnJlcGxhY2VEZWVwKHBhcmVudFBhdGgsIG5ld1BhcmVudCk7XG5cbiAgICB2YXIgZGVzdCA9IG5ldyBfbW9kZWwuUG9zKHBhcmVudFBhdGguY29uY2F0KG9mZnNldCArIDEpLCAwKTtcbiAgICB2YXIgbWFwID0gbmV3IF9tYXAuUG9zTWFwKFtuZXcgX21hcC5Nb3ZlZFJhbmdlKHBvcywgdGFyZ2V0U2l6ZSAtIHBvcy5vZmZzZXQsIGRlc3QpLCBuZXcgX21hcC5Nb3ZlZFJhbmdlKG5ldyBfbW9kZWwuUG9zKHBhcmVudFBhdGgsIG9mZnNldCArIDEpLCBuZXdQYXJlbnQuc2l6ZSAtIDIgLSBvZmZzZXQsIG5ldyBfbW9kZWwuUG9zKHBhcmVudFBhdGgsIG9mZnNldCArIDIpKV0sIFtuZXcgX21hcC5SZXBsYWNlZFJhbmdlKHBvcywgcG9zLCBwb3MsIGRlc3QsIHBvcywgcG9zLnNob3J0ZW4obnVsbCwgMSkpXSk7XG4gICAgcmV0dXJuIG5ldyBfc3RlcC5TdGVwUmVzdWx0KGNvcHksIG1hcCk7XG4gIH0sXG4gIGludmVydDogZnVuY3Rpb24gaW52ZXJ0KHN0ZXAsIF9vbGREb2MsIG1hcCkge1xuICAgIHJldHVybiBuZXcgX3N0ZXAuU3RlcChcImpvaW5cIiwgc3RlcC5wb3MsIG1hcC5tYXAoc3RlcC5wb3MpLnBvcyk7XG4gIH0sXG4gIHBhcmFtVG9KU09OOiBmdW5jdGlvbiBwYXJhbVRvSlNPTihwYXJhbSkge1xuICAgIHJldHVybiBwYXJhbSAmJiB7IHR5cGU6IHBhcmFtLnR5cGUubmFtZSwgYXR0cnM6IHBhcmFtLmF0dHJzIH07XG4gIH0sXG4gIHBhcmFtRnJvbUpTT046IGZ1bmN0aW9uIHBhcmFtRnJvbUpTT04oc2NoZW1hLCBqc29uKSB7XG4gICAgcmV0dXJuIGpzb24gJiYgeyB0eXBlOiBzY2hlbWEubm9kZVR5cGUoanNvbi50eXBlKSwgYXR0cnM6IGpzb24uYXR0cnMgfTtcbiAgfVxufSk7XG5cbi8vIDo6IChQb3MsID9udW1iZXIsID9Ob2RlVHlwZSwgP09iamVjdCkg4oaSIFRyYW5zZm9ybVxuLy8gU3BsaXQgdGhlIG5vZGUgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLCBhbmQgb3B0aW9uYWxseSwgaWYgYGRlcHRoYCBpc1xuLy8gZ3JlYXRlciB0aGFuIG9uZSwgYW55IG51bWJlciBvZiBub2RlcyBhYm92ZSB0aGF0LiBCeSBkZWZhdWx0LCB0aGUgcGFydFxuLy8gc3BsaXQgb2ZmIHdpbGwgaW5oZXJpdCB0aGUgbm9kZSB0eXBlIG9mIHRoZSBvcmlnaW5hbCBub2RlLiBUaGlzIGNhblxuLy8gYmUgY2hhbmdlZCBieSBwYXNzaW5nIGB0eXBlQWZ0ZXJgIGFuZCBgYXR0cnNBZnRlcmAuXG5fdHJhbnNmb3JtLlRyYW5zZm9ybS5wcm90b3R5cGUuc3BsaXQgPSBmdW5jdGlvbiAocG9zLCBkZXB0aCwgdHlwZUFmdGVyLCBhdHRyc0FmdGVyKSB7XG4gIGlmIChkZXB0aCA9PT0gdW5kZWZpbmVkKSBkZXB0aCA9IDE7XG5cbiAgaWYgKGRlcHRoID09IDApIHJldHVybiB0aGlzO1xuICBmb3IgKHZhciBpID0gMDs7IGkrKykge1xuICAgIHRoaXMuc3RlcChcInNwbGl0XCIsIG51bGwsIG51bGwsIHBvcywgdHlwZUFmdGVyICYmIHsgdHlwZTogdHlwZUFmdGVyLCBhdHRyczogYXR0cnNBZnRlciB9KTtcbiAgICBpZiAoaSA9PSBkZXB0aCAtIDEpIHJldHVybiB0aGlzO1xuICAgIHR5cGVBZnRlciA9IG51bGw7XG4gICAgcG9zID0gcG9zLnNob3J0ZW4obnVsbCwgMSk7XG4gIH1cbn07XG5cbi8vIDo6IChQb3MsID9udW1iZXIpIOKGkiBUcmFuc2Zvcm1cbi8vIFNwbGl0IGF0IHRoZSBnaXZlbiBwb3NpdGlvbiwgX2lmXyB0aGF0IHBvc2l0aW9uIGlzbid0IGFscmVhZHkgYXRcbi8vIHRoZSBzdGFydCBvciBlbmQgb2YgYSBub2RlLiBJZiBgZGVwdGhgIGlzIGdyZWF0ZXIgdGhhbiBvbmUsIGFsc28gZG9cbi8vIHNvIGZvciBwYXJlbnQgcG9zaXRpb25zIGFib3ZlIHRoZSBnaXZlbiBwb3NpdGlvbi5cbl90cmFuc2Zvcm0uVHJhbnNmb3JtLnByb3RvdHlwZS5zcGxpdElmTmVlZGVkID0gZnVuY3Rpb24gKHBvcykge1xuICB2YXIgZGVwdGggPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyAxIDogYXJndW1lbnRzWzFdO1xuXG4gIGZvciAodmFyIG9mZiA9IDA7IG9mZiA8IGRlcHRoOyBvZmYrKykge1xuICAgIHZhciBoZXJlID0gcG9zLnNob3J0ZW4ocG9zLmRlcHRoIC0gb2ZmKTtcbiAgICBpZiAoaGVyZS5vZmZzZXQgJiYgaGVyZS5vZmZzZXQgPCB0aGlzLmRvYy5wYXRoKGhlcmUucGF0aCkuc2l6ZSkgdGhpcy5zdGVwKFwic3BsaXRcIiwgbnVsbCwgbnVsbCwgaGVyZSk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBfbW9kZWwgPSByZXF1aXJlKFwiLi4vbW9kZWxcIik7XG5cbnZhciBfbWFwID0gcmVxdWlyZShcIi4vbWFwXCIpO1xuXG4vLyA7OyBBIHN0ZXAgb2JqZWN0IHdyYXBzIGFuIGF0b21pYyBvcGVyYXRpb24uIEl0IGdlbmVyYWxseSBhcHBsaWVzXG4vLyBvbmx5IHRvIHRoZSBkb2N1bWVudCBpdCB3YXMgY3JlYXRlZCBmb3IsIHNpbmNlIHRoZSBwb3NpdGlvbnNcbi8vIGFzc29jaWF0ZWQgd2l0aCBpdCB3aWxsIG9ubHkgbWFrZSBzZW5zZSBmb3IgdGhhdCBkb2N1bWVudC5cblxudmFyIFN0ZXAgPSAoZnVuY3Rpb24gKCkge1xuICAvLyA6OiAoc3RyaW5nLCA/UG9zLCA/UG9zLCA/UG9zLCA/YW55KVxuICAvLyBCdWlsZCBhIHN0ZXAuIFRoZSB0eXBlIHNob3VsZCBuYW1lIGEgW2RlZmluZWRdKFN0ZXAuZGVmaW5lKSBzdGVwXG4gIC8vIHR5cGUsIGFuZCB0aGUgc2hhcGUgb2YgdGhlIHBvc2l0aW9ucyBhbmQgcGFyYW1ldGVyIHNob3VsZCBiZVxuICAvLyBhcHByb3ByaWF0ZSBmb3IgdGhhdCB0eXBlLlxuXG4gIGZ1bmN0aW9uIFN0ZXAodHlwZSwgZnJvbSwgdG8sIHBvcykge1xuICAgIHZhciBwYXJhbSA9IGFyZ3VtZW50cy5sZW5ndGggPD0gNCB8fCBhcmd1bWVudHNbNF0gPT09IHVuZGVmaW5lZCA/IG51bGwgOiBhcmd1bWVudHNbNF07XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU3RlcCk7XG5cbiAgICBpZiAoISh0eXBlIGluIHN0ZXBzKSkgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBzdGVwIHR5cGU6IFwiICsgdHlwZSk7XG4gICAgLy8gOjogc3RyaW5nXG4gICAgLy8gVGhlIHR5cGUgb2YgdGhlIHN0ZXAuXG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAvLyA6OiA/UG9zXG4gICAgLy8gVGhlIHN0YXJ0IG9mIHRoZSBzdGVwJ3MgcmFuZ2UsIGlmIGFueS4gV2hpY2ggb2YgdGhlIHRocmVlXG4gICAgLy8gb3B0aW9uYWwgcG9zaXRpb25zIGFzc29jaWF0ZWQgd2l0aCBhIHN0ZXAgYSBnaXZlbiBzdGVwIHR5cGVcbiAgICAvLyB1c2VzIGRpZmZlcnMuIFRoZSB3YXkgZWFjaCBvZiB0aGVzZSBwb3NpdGlvbnMgaXMgbWFwcGVkIHdoZW5cbiAgICAvLyB0aGUgc3RlcCBpcyBtYXBwZWQgb3ZlciBhIFtwb3NpdGlvbiBtYXBwaW5nXSgjUG9zTWFwKSBkZXBlbmRzXG4gICAgLy8gb24gaXRzIHJvbGUuXG4gICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICAvLyA6OiA/UG9zXG4gICAgLy8gVGhlIGVuZCBvZiB0aGUgc3RlcCdzIHJhbmdlLlxuICAgIHRoaXMudG8gPSB0bztcbiAgICAvLyA6OiA/UG9zXG4gICAgLy8gVGhlIGJhc2UgcG9zaXRpb24gZm9yIHRoaXMgc3RlcC5cbiAgICB0aGlzLnBvcyA9IHBvcztcbiAgICAvLyA6OiA/YW55XG4gICAgLy8gRXh0cmEgc3RlcC10eXBlLXNwZWNpZmljIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RlcC5cbiAgICB0aGlzLnBhcmFtID0gcGFyYW07XG4gIH1cblxuICAvLyA7OyAjdG9jPWZhbHNlIE9iamVjdHMgb2YgdGhpcyB0eXBlIGFyZSByZXR1cm5lZCBhcyB0aGUgcmVzdWx0IG9mXG4gIC8vIGFwcGx5aW5nIGEgdHJhbnNmb3JtIHN0ZXAgdG8gYSBkb2N1bWVudC5cblxuICAvLyA6OiAoTm9kZSkg4oaSID9TdGVwUmVzdWx0XG4gIC8vIEFwcGxpZXMgdGhpcyBzdGVwIHRvIHRoZSBnaXZlbiBkb2N1bWVudCwgcmV0dXJuaW5nIGEgcmVzdWx0XG4gIC8vIGNvbnRhaW5pbmcgdGhlIHRyYW5zZm9ybWVkIGRvY3VtZW50ICh0aGUgaW5wdXQgZG9jdW1lbnQgaXMgbm90XG4gIC8vIGNoYW5nZWQpIGFuZCBhIGBQb3NNYXBgLiBJZiB0aGUgc3RlcCBjb3VsZCBub3QgbWVhbmluZ2Z1bGx5IGJlXG4gIC8vIGFwcGxpZWQgdG8gdGhlIGdpdmVuIGRvY3VtZW50LCB0aGlzIHJldHVybnMgYG51bGxgLlxuXG4gIF9jcmVhdGVDbGFzcyhTdGVwLCBbe1xuICAgIGtleTogXCJhcHBseVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhcHBseShkb2MpIHtcbiAgICAgIHJldHVybiBzdGVwc1t0aGlzLnR5cGVdLmFwcGx5KGRvYywgdGhpcyk7XG4gICAgfVxuXG4gICAgLy8gOjogKE5vZGUsIFBvc01hcCkg4oaSIFN0ZXBcbiAgICAvLyBDcmVhdGUgYW4gaW52ZXJ0ZWQgdmVyc2lvbiBvZiB0aGlzIHN0ZXAuIE5lZWRzIHRoZSBkb2N1bWVudCBhcyBpdFxuICAgIC8vIHdhcyBiZWZvcmUgdGhlIHN0ZXAsIGFzIHdlbGwgYXMgYFBvc01hcGAgY3JlYXRlZCBieSBhcHBseWluZyB0aGVcbiAgICAvLyBzdGVwIHRvIHRoYXQgZG9jdW1lbnQsIGFzIGlucHV0LlxuICB9LCB7XG4gICAga2V5OiBcImludmVydFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnZlcnQob2xkRG9jLCBtYXApIHtcbiAgICAgIHJldHVybiBzdGVwc1t0aGlzLnR5cGVdLmludmVydCh0aGlzLCBvbGREb2MsIG1hcCk7XG4gICAgfVxuXG4gICAgLy8gOjogKE1hcHBhYmxlKSDihpIgP1N0ZXBcbiAgICAvLyBNYXAgdGhpcyBzdGVwIHRocm91Z2ggYSBtYXBwYWJsZSB0aGluZywgcmV0dXJuaW5nIGVpdGhlciBhXG4gICAgLy8gdmVyc2lvbiBvZiB0aGF0IHN0ZXAgd2l0aCBpdHMgcG9zaXRpb25zIGFkanVzdGVkLCBvciBgbnVsbGAgaWZcbiAgICAvLyB0aGUgc3RlcCB3YXMgZW50aXJlbHkgZGVsZXRlZCBieSB0aGUgbWFwcGluZy5cbiAgfSwge1xuICAgIGtleTogXCJtYXBcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWFwKHJlbWFwcGluZykge1xuICAgICAgdmFyIGFsbERlbGV0ZWQgPSB0cnVlO1xuICAgICAgdmFyIGZyb20gPSBudWxsLFxuICAgICAgICAgIHRvID0gbnVsbCxcbiAgICAgICAgICBwb3MgPSBudWxsO1xuXG4gICAgICBpZiAodGhpcy5mcm9tKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSByZW1hcHBpbmcubWFwKHRoaXMuZnJvbSwgMSk7XG4gICAgICAgIGZyb20gPSByZXN1bHQucG9zO1xuICAgICAgICBpZiAoIXJlc3VsdC5kZWxldGVkKSBhbGxEZWxldGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy50bykge1xuICAgICAgICBpZiAodGhpcy50by5jbXAodGhpcy5mcm9tKSA9PSAwKSB7XG4gICAgICAgICAgdG8gPSBmcm9tO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciByZXN1bHQgPSByZW1hcHBpbmcubWFwKHRoaXMudG8sIC0xKTtcbiAgICAgICAgICB0byA9IHJlc3VsdC5wb3MubWF4KGZyb20pO1xuICAgICAgICAgIGlmICghcmVzdWx0LmRlbGV0ZWQpIGFsbERlbGV0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMucG9zKSB7XG4gICAgICAgIGlmIChmcm9tICYmIHRoaXMucG9zLmNtcCh0aGlzLmZyb20pID09IDApIHtcbiAgICAgICAgICBwb3MgPSBmcm9tO1xuICAgICAgICB9IGVsc2UgaWYgKHRvICYmIHRoaXMucG9zLmNtcCh0aGlzLnRvKSA9PSAwKSB7XG4gICAgICAgICAgcG9zID0gdG87XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IHJlbWFwcGluZy5tYXAodGhpcy5wb3MsIDEpO1xuICAgICAgICAgIHBvcyA9IHJlc3VsdC5wb3M7XG4gICAgICAgICAgaWYgKCFyZXN1bHQuZGVsZXRlZCkgYWxsRGVsZXRlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYWxsRGVsZXRlZCA/IG51bGwgOiBuZXcgU3RlcCh0aGlzLnR5cGUsIGZyb20sIHRvLCBwb3MsIHRoaXMucGFyYW0pO1xuICAgIH1cblxuICAgIC8vIDo6ICgpIOKGkiBPYmplY3RcbiAgICAvLyBDcmVhdGUgYSBKU09OLXNlcmlhbGl6ZWFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzdGVwLlxuICB9LCB7XG4gICAga2V5OiBcInRvSlNPTlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b0pTT04oKSB7XG4gICAgICB2YXIgaW1wbCA9IHN0ZXBzW3RoaXMudHlwZV07XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgIGZyb206IHRoaXMuZnJvbSxcbiAgICAgICAgdG86IHRoaXMudG8sXG4gICAgICAgIHBvczogdGhpcy5wb3MsXG4gICAgICAgIHBhcmFtOiBpbXBsLnBhcmFtVG9KU09OID8gaW1wbC5wYXJhbVRvSlNPTih0aGlzLnBhcmFtKSA6IHRoaXMucGFyYW1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gOjogKFNjaGVtYSwgT2JqZWN0KSDihpIgU3RlcFxuICAgIC8vIERlc2VyaWFsaXplIGEgc3RlcCBmcm9tIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uLlxuICB9XSwgW3tcbiAgICBrZXk6IFwiZnJvbUpTT05cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZnJvbUpTT04oc2NoZW1hLCBqc29uKSB7XG4gICAgICB2YXIgaW1wbCA9IHN0ZXBzW2pzb24udHlwZV07XG4gICAgICByZXR1cm4gbmV3IFN0ZXAoanNvbi50eXBlLCBqc29uLmZyb20gJiYgX21vZGVsLlBvcy5mcm9tSlNPTihqc29uLmZyb20pLCBqc29uLnRvICYmIF9tb2RlbC5Qb3MuZnJvbUpTT04oanNvbi50byksIGpzb24ucG9zICYmIF9tb2RlbC5Qb3MuZnJvbUpTT04oanNvbi5wb3MpLCBpbXBsLnBhcmFtRnJvbUpTT04gPyBpbXBsLnBhcmFtRnJvbUpTT04oc2NoZW1hLCBqc29uLnBhcmFtKSA6IGpzb24ucGFyYW0pO1xuICAgIH1cblxuICAgIC8vIDo6IChzdHJpbmcsIE9iamVjdClcbiAgICAvLyBEZWZpbmUgYSBuZXcgdHlwZSBvZiBzdGVwLiBJbXBsZW1lbnRhdGlvbiBzaG91bGQgaGF2ZSB0aGVcbiAgICAvLyBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAvL1xuICAgIC8vICoqYGFwcGx5YCoqYChkb2M6IE5vZGUsIHN0ZXA6IFN0ZXApIOKGkiA/U3RlcFJlc3VsdFxuICAgIC8vICAgOiBBcHBsaWVzIHRoZSBzdGVwIHRvIGEgZG9jdW1lbnQuXG4gICAgLy8gKipgaW52ZXJ0YCoqYChzdGVwOiBTdGVwLCBvbGREb2M6IE5vZGUsIG1hcDogUG9zTWFwKSDihpIgU3RlcFxuICAgIC8vICAgOiBDcmVhdGUgYW4gaW52ZXJ0ZWQgdmVyc2lvbiBvZiB0aGUgc3RlcC5cbiAgICAvLyAqKmBwYXJhbVRvSlNPTmAqKmAocGFyYW06ID9hbnkpIOKGkiA/T2JqZWN0XG4gICAgLy8gICA6IFNlcmlhbGl6ZSB0aGlzIHN0ZXAgdHlwZSdzIHBhcmFtZXRlciB0byBKU09OLlxuICAgIC8vICoqYHBhcmFtRnJvbUpTT05gKipgKHNjaGVtYTogU2NoZW1hLCBqc29uOiA/T2JqZWN0KSDihpIgP2FueVxuICAgIC8vICAgOiBEZXNlcmlhbGl6ZSB0aGlzIHN0ZXAgdHlwZSdzIHBhcmFtZXRlciBmcm9tIEpTT04uXG4gIH0sIHtcbiAgICBrZXk6IFwiZGVmaW5lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlZmluZSh0eXBlLCBpbXBsZW1lbnRhdGlvbikge1xuICAgICAgc3RlcHNbdHlwZV0gPSBpbXBsZW1lbnRhdGlvbjtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gU3RlcDtcbn0pKCk7XG5cbmV4cG9ydHMuU3RlcCA9IFN0ZXA7XG5cbnZhciBTdGVwUmVzdWx0ID0gZnVuY3Rpb24gU3RlcFJlc3VsdChkb2MpIHtcbiAgdmFyIG1hcCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IF9tYXAubnVsbE1hcCA6IGFyZ3VtZW50c1sxXTtcblxuICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU3RlcFJlc3VsdCk7XG5cbiAgLy8gOjogTm9kZSBUaGUgdHJhbnNmb3JtZWQgZG9jdW1lbnQuXG4gIHRoaXMuZG9jID0gZG9jO1xuICAvLyA6OiBQb3NNYXBcbiAgLy8gVGhlIHBvc2l0aW9uIG1hcCB0aGF0IGRlc2NyaWJlcyB0aGUgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiB0aGVcbiAgLy8gb2xkIGFuZCB0aGUgbmV3IGRvY3VtZW50LlxuICB0aGlzLm1hcCA9IG1hcDtcbn07XG5cbmV4cG9ydHMuU3RlcFJlc3VsdCA9IFN0ZXBSZXN1bHQ7XG5cbnZhciBzdGVwcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIF9zdGVwMiA9IHJlcXVpcmUoXCIuL3N0ZXBcIik7XG5cbnZhciBfbWFwID0gcmVxdWlyZShcIi4vbWFwXCIpO1xuXG4vLyA7OyBBIGNoYW5nZSB0byBhIGRvY3VtZW50IG9mdGVuIGNvbnNpc3RzIG9mIGEgc2VyaWVzIG9mXG4vLyBbc3RlcHNdKCNTdGVwKS4gVGhpcyBjbGFzcyBwcm92aWRlcyBhIGNvbnZlbmllbmNlIGFic3RyYWN0aW9uIHRvXG4vLyBidWlsZCB1cCBhbmQgdHJhY2sgc3VjaCBhbiBhcnJheSBvZiBzdGVwcy4gQSBgVHJhbnNmb3JtYCBvYmplY3Rcbi8vIGltcGxlbWVudHMgYE1hcHBhYmxlYC5cbi8vXG4vLyBUaGUgaGlnaC1sZXZlbCB0cmFuc2Zvcm1pbmcgbWV0aG9kcyByZXR1cm4gdGhlIGBUcmFuc2Zvcm1gIG9iamVjdFxuLy8gaXRzZWxmLCBzbyB0aGF0IHRoZXkgY2FuIGJlIGNoYWluZWQuXG5cbnZhciBUcmFuc2Zvcm0gPSAoZnVuY3Rpb24gKCkge1xuICAvLyA6OiAoTm9kZSlcbiAgLy8gQ3JlYXRlIGEgdHJhbnNmb3JtYXRpb24gdGhhdCBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gZG9jdW1lbnQuXG5cbiAgZnVuY3Rpb24gVHJhbnNmb3JtKGRvYykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUcmFuc2Zvcm0pO1xuXG4gICAgLy8gOjogW1N0ZXBdXG4gICAgLy8gVGhlIGFjY3VtdWxhdGVkIHN0ZXBzLlxuICAgIHRoaXMuc3RlcHMgPSBbXTtcbiAgICAvLyA6OiBbTm9kZV1cbiAgICAvLyBUaGUgaW5kaXZpZHVhbCBkb2N1bWVudCB2ZXJzaW9ucy4gQWx3YXlzIGhhcyBhIGxlbmd0aCBvbmUgbW9yZVxuICAgIC8vIHRoYW4gYHN0ZXBzYCwgc2luY2UgaXQgYWxzbyBpbmNsdWRlcyB0aGUgb3JpZ2luYWwgc3RhcnRpbmdcbiAgICAvLyBkb2N1bWVudC5cbiAgICB0aGlzLmRvY3MgPSBbZG9jXTtcbiAgICAvLyA6OiBbUG9zTWFwXVxuICAgIC8vIFRoZSBwb3NpdGlvbiBtYXBzIHByb2R1Y2VkIGJ5IHRoZSBzdGVwcy4gSGFzIHRoZSBzYW1lIGxlbmd0aCBhc1xuICAgIC8vIGBzdGVwc2AuXG4gICAgdGhpcy5tYXBzID0gW107XG4gIH1cblxuICAvLyA6OiBOb2RlXG4gIC8vIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIHRyYW5zZm9ybWVkIGRvY3VtZW50LlxuXG4gIF9jcmVhdGVDbGFzcyhUcmFuc2Zvcm0sIFt7XG4gICAga2V5OiBcInN0ZXBcIixcblxuICAgIC8vIDo6IChTdGVwKSDihpIgP1N0ZXBSZXN1bHRcbiAgICAvLyBBZGQgYSBzdGVwIHRvIHRoaXMgdHJhbnNmb3JtYXRpb24uIElmIHRoZSBzdGVwIGNhbiBiZVxuICAgIC8vIFthcHBsaWVkXSgjU3RlcC5hcHBseSkgdG8gdGhlIGN1cnJlbnQgZG9jdW1lbnQsIHRoZSByZXN1bHQgb2ZcbiAgICAvLyBhcHBseWluZyBpdCBpcyByZXR1cm5lZCwgYW5kIGFuIGVsZW1lbnQgaXMgYWRkZWQgdG8gdGhlXG4gICAgLy8gW2BzdGVwc2BdKCNUcmFuc2Zvcm0uc3RlcHMpLCBbYGRvY3NgXSgjVHJhbnNmb3JtLmRvY3MpLCBhbmRcbiAgICAvLyBbYG1hcHNgXSgjVHJhbnNmb3JtLm1hcHMpIGFycmF5cy5cbiAgICB2YWx1ZTogZnVuY3Rpb24gc3RlcChfc3RlcCwgZnJvbSwgdG8sIHBvcywgcGFyYW0pIHtcbiAgICAgIGlmICh0eXBlb2YgX3N0ZXAgPT0gXCJzdHJpbmdcIikgX3N0ZXAgPSBuZXcgX3N0ZXAyLlN0ZXAoX3N0ZXAsIGZyb20sIHRvLCBwb3MsIHBhcmFtKTtcbiAgICAgIHZhciByZXN1bHQgPSBfc3RlcC5hcHBseSh0aGlzLmRvYyk7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHRoaXMuc3RlcHMucHVzaChfc3RlcCk7XG4gICAgICAgIHRoaXMubWFwcy5wdXNoKHJlc3VsdC5tYXApO1xuICAgICAgICB0aGlzLmRvY3MucHVzaChyZXN1bHQuZG9jKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8gOjogKFBvcywgP251bWJlcikg4oaSIE1hcFJlc3VsdFxuICAgIC8vIE1hcCBhIHBvc2l0aW9uIHRocm91Z2ggdGhlIHdob2xlIHRyYW5zZm9ybWF0aW9uIChhbGwgdGhlIHBvc2l0aW9uXG4gICAgLy8gbWFwcyBpbiBbYG1hcHNgXSgjVHJhbnNmb3JtLm1hcHMpKSwgYW5kIHJldHVybiB0aGUgcmVzdWx0LlxuICB9LCB7XG4gICAga2V5OiBcIm1hcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYXAocG9zLCBiaWFzKSB7XG4gICAgICB2YXIgZGVsZXRlZCA9IGZhbHNlO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm1hcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMubWFwc1tpXS5tYXAocG9zLCBiaWFzKTtcbiAgICAgICAgcG9zID0gcmVzdWx0LnBvcztcbiAgICAgICAgaWYgKHJlc3VsdC5kZWxldGVkKSBkZWxldGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgX21hcC5NYXBSZXN1bHQocG9zLCBkZWxldGVkKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZG9jXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5kb2NzW3RoaXMuZG9jcy5sZW5ndGggLSAxXTtcbiAgICB9XG5cbiAgICAvLyA6OiBOb2RlXG4gICAgLy8gVGhlIG9yaWdpbmFsIGlucHV0IGRvY3VtZW50LlxuICB9LCB7XG4gICAga2V5OiBcImJlZm9yZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuZG9jc1swXTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gVHJhbnNmb3JtO1xufSkoKTtcblxuZXhwb3J0cy5UcmFuc2Zvcm0gPSBUcmFuc2Zvcm07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmNvcHlTdHJ1Y3R1cmUgPSBjb3B5U3RydWN0dXJlO1xuZXhwb3J0cy5jb3B5SW5saW5lID0gY29weUlubGluZTtcbmV4cG9ydHMuaXNGbGF0UmFuZ2UgPSBpc0ZsYXRSYW5nZTtcbmV4cG9ydHMucmVwbGFjZUhhc0VmZmVjdCA9IHJlcGxhY2VIYXNFZmZlY3Q7XG5leHBvcnRzLnNhbWVQYXRoRGVwdGggPSBzYW1lUGF0aERlcHRoO1xuXG52YXIgX21vZGVsID0gcmVxdWlyZShcIi4uL21vZGVsXCIpO1xuXG5mdW5jdGlvbiBjb3B5U3RydWN0dXJlKG5vZGUsIGZyb20sIHRvLCBmKSB7XG4gIHZhciBkZXB0aCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gNCB8fCBhcmd1bWVudHNbNF0gPT09IHVuZGVmaW5lZCA/IDAgOiBhcmd1bWVudHNbNF07XG5cbiAgaWYgKG5vZGUuaXNUZXh0YmxvY2spIHtcbiAgICByZXR1cm4gZihub2RlLCBmcm9tID8gZnJvbS5vZmZzZXQgOiAwLCB0byA/IHRvLm9mZnNldCA6IG5vZGUuc2l6ZSk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKCFub2RlLnNpemUpIHJldHVybiBub2RlO1xuICAgIHZhciBzdGFydCA9IGZyb20gPyBmcm9tLnBhdGhbZGVwdGhdIDogMDtcbiAgICB2YXIgZW5kID0gdG8gPyB0by5wYXRoW2RlcHRoXSArIDEgOiBub2RlLnNpemU7XG4gICAgdmFyIGNvbnRlbnQgPSBub2RlLmNvbnRlbnQudG9BcnJheSgwLCBzdGFydCk7XG4gICAgZm9yICh2YXIgaXRlciA9IG5vZGUuaXRlcihzdGFydCwgZW5kKSwgY2hpbGQgPSB1bmRlZmluZWQ7IGNoaWxkID0gaXRlci5uZXh0KCkudmFsdWU7KSB7XG4gICAgICB2YXIgcGFzc0Zyb20gPSBpdGVyLm9mZnNldCAtIGNoaWxkLndpZHRoID09IHN0YXJ0ID8gZnJvbSA6IG51bGw7XG4gICAgICB2YXIgcGFzc1RvID0gaXRlci5vZmZzZXQgPT0gZW5kID8gdG8gOiBudWxsO1xuICAgICAgY29udGVudC5wdXNoKGNvcHlTdHJ1Y3R1cmUoY2hpbGQsIHBhc3NGcm9tLCBwYXNzVG8sIGYsIGRlcHRoICsgMSkpO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZS5jb3B5KF9tb2RlbC5GcmFnbWVudC5mcm9tQXJyYXkoY29udGVudC5jb25jYXQobm9kZS5jb250ZW50LnRvQXJyYXkoZW5kKSkpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb3B5SW5saW5lKG5vZGUsIGZyb20sIHRvLCBmKSB7XG4gIHJldHVybiBub2RlLnNwbGljZShmcm9tLCB0bywgbm9kZS5jb250ZW50LnNsaWNlKGZyb20sIHRvKS5tYXAoZikpO1xufVxuXG5mdW5jdGlvbiBpc0ZsYXRSYW5nZShmcm9tLCB0bykge1xuICBpZiAoZnJvbS5wYXRoLmxlbmd0aCAhPSB0by5wYXRoLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGZyb20ucGF0aC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChmcm9tLnBhdGhbaV0gIT0gdG8ucGF0aFtpXSkgcmV0dXJuIGZhbHNlO1xuICB9cmV0dXJuIGZyb20ub2Zmc2V0IDw9IHRvLm9mZnNldDtcbn1cblxuZnVuY3Rpb24gY2FuQmVKb2luZWQobm9kZSwgb2Zmc2V0LCBkZXB0aCkge1xuICBpZiAoIWRlcHRoIHx8IG9mZnNldCA9PSAwIHx8IG9mZnNldCA9PSBub2RlLnNpemUpIHJldHVybiBmYWxzZTtcbiAgdmFyIGxlZnQgPSBub2RlLmNoaWxkKG9mZnNldCAtIDEpLFxuICAgICAgcmlnaHQgPSBub2RlLmNoaWxkKG9mZnNldCk7XG4gIHJldHVybiBsZWZ0LnNhbWVNYXJrdXAocmlnaHQpO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlSGFzRWZmZWN0KGRvYywgZnJvbSwgdG8pIHtcbiAgZm9yICh2YXIgZGVwdGggPSAwLCBub2RlID0gZG9jOzsgZGVwdGgrKykge1xuICAgIHZhciBmcm9tRW5kID0gZGVwdGggPT0gZnJvbS5kZXB0aCxcbiAgICAgICAgdG9FbmQgPSBkZXB0aCA9PSB0by5kZXB0aDtcbiAgICBpZiAoZnJvbUVuZCB8fCB0b0VuZCB8fCBmcm9tLnBhdGhbZGVwdGhdICE9IHRvLnBhdGhbZGVwdGhdKSB7XG4gICAgICB2YXIgZ2FwU3RhcnQgPSB1bmRlZmluZWQsXG4gICAgICAgICAgZ2FwRW5kID0gdW5kZWZpbmVkO1xuICAgICAgaWYgKGZyb21FbmQpIHtcbiAgICAgICAgZ2FwU3RhcnQgPSBmcm9tLm9mZnNldDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGdhcFN0YXJ0ID0gZnJvbS5wYXRoW2RlcHRoXSArIDE7XG4gICAgICAgIGZvciAodmFyIGkgPSBkZXB0aCArIDEsIG4gPSBub2RlLmNoaWxkKGdhcFN0YXJ0IC0gMSk7IGkgPD0gZnJvbS5wYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGkgPT0gZnJvbS5wYXRoLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGZyb20ub2Zmc2V0IDwgbi5zaXplKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGZyb20ucGF0aFtpXSArIDEgPCBuLnNpemUpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgbiA9IG4uY2hpbGQoZnJvbS5wYXRoW2ldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0b0VuZCkge1xuICAgICAgICBnYXBFbmQgPSB0by5vZmZzZXQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBnYXBFbmQgPSB0by5wYXRoW2RlcHRoXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IGRlcHRoICsgMTsgaSA8PSB0by5wYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKChpID09IHRvLnBhdGgubGVuZ3RoID8gdG8ub2Zmc2V0IDogdG8ucGF0aFtpXSkgPiAwKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGdhcFN0YXJ0ICE9IGdhcEVuZCkgcmV0dXJuIHRydWU7XG4gICAgICByZXR1cm4gY2FuQmVKb2luZWQobm9kZSwgZ2FwU3RhcnQsIE1hdGgubWluKGZyb20uZGVwdGgsIHRvLmRlcHRoKSAtIGRlcHRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZSA9IG5vZGUuY2hpbGQoZnJvbS5wYXRoW2RlcHRoXSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNhbWVQYXRoRGVwdGgoYSwgYikge1xuICBmb3IgKHZhciBpID0gMDs7IGkrKykge1xuICAgIGlmIChpID09IGEucGF0aC5sZW5ndGggfHwgaSA9PSBiLnBhdGgubGVuZ3RoIHx8IGEucGF0aFtpXSAhPSBiLnBhdGhbaV0pIHJldHVybiBpO1xuICB9XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxudmFyIF9nZXQgPSBmdW5jdGlvbiBnZXQoX3gsIF94MiwgX3gzKSB7IHZhciBfYWdhaW4gPSB0cnVlOyBfZnVuY3Rpb246IHdoaWxlIChfYWdhaW4pIHsgdmFyIG9iamVjdCA9IF94LCBwcm9wZXJ0eSA9IF94MiwgcmVjZWl2ZXIgPSBfeDM7IF9hZ2FpbiA9IGZhbHNlOyBpZiAob2JqZWN0ID09PSBudWxsKSBvYmplY3QgPSBGdW5jdGlvbi5wcm90b3R5cGU7IHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTsgaWYgKGRlc2MgPT09IHVuZGVmaW5lZCkgeyB2YXIgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7IGlmIChwYXJlbnQgPT09IG51bGwpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSBlbHNlIHsgX3ggPSBwYXJlbnQ7IF94MiA9IHByb3BlcnR5OyBfeDMgPSByZWNlaXZlcjsgX2FnYWluID0gdHJ1ZTsgZGVzYyA9IHBhcmVudCA9IHVuZGVmaW5lZDsgY29udGludWUgX2Z1bmN0aW9uOyB9IH0gZWxzZSBpZiAoXCJ2YWx1ZVwiIGluIGRlc2MpIHsgcmV0dXJuIGRlc2MudmFsdWU7IH0gZWxzZSB7IHZhciBnZXR0ZXIgPSBkZXNjLmdldDsgaWYgKGdldHRlciA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gcmV0dXJuIGdldHRlci5jYWxsKHJlY2VpdmVyKTsgfSB9IH07XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgUHJvc2VNaXJyb3JFcnJvciA9IChmdW5jdGlvbiAoX0Vycm9yKSB7XG4gIF9pbmhlcml0cyhQcm9zZU1pcnJvckVycm9yLCBfRXJyb3IpO1xuXG4gIGZ1bmN0aW9uIFByb3NlTWlycm9yRXJyb3IobWVzc2FnZSkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQcm9zZU1pcnJvckVycm9yKTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKFByb3NlTWlycm9yRXJyb3IucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5jYWxsKHRoaXMsIG1lc3NhZ2UpO1xuICAgIGlmICh0aGlzLm1lc3NhZ2UgIT0gbWVzc2FnZSkge1xuICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5uYW1lKTtlbHNlIHRoaXMuc3RhY2sgPSBuZXcgRXJyb3IobWVzc2FnZSkuc3RhY2s7XG4gICAgfVxuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFByb3NlTWlycm9yRXJyb3IsIFt7XG4gICAga2V5OiBcIm5hbWVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgfHwgZnVuY3Rpb25OYW1lKHRoaXMuY29uc3RydWN0b3IpIHx8IFwiUHJvc2VNaXJyb3JFcnJvclwiO1xuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiBcInJhaXNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJhaXNlKG1lc3NhZ2UpIHtcbiAgICAgIHRocm93IG5ldyB0aGlzKG1lc3NhZ2UpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBQcm9zZU1pcnJvckVycm9yO1xufSkoRXJyb3IpO1xuXG5leHBvcnRzLlByb3NlTWlycm9yRXJyb3IgPSBQcm9zZU1pcnJvckVycm9yO1xuXG5mdW5jdGlvbiBmdW5jdGlvbk5hbWUoZikge1xuICB2YXIgbWF0Y2ggPSAvXmZ1bmN0aW9uIChcXHcrKS8uZXhlYyhmLnRvU3RyaW5nKCkpO1xuICByZXR1cm4gbWF0Y2ggJiYgbWF0Y2hbMV07XG59IiwiLy8gOzsgI3BhdGg9RXZlbnRNaXhpbiAja2luZD1pbnRlcmZhY2Vcbi8vIEEgc2V0IG9mIG1ldGhvZHMgZm9yIG9iamVjdHMgdGhhdCBlbWl0IGV2ZW50cy4gQWRkZWQgYnkgY2FsbGluZ1xuLy8gYGV2ZW50TWl4aW5gIG9uIGEgY29uc3RydWN0b3IuXG5cblwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5ldmVudE1peGluID0gZXZlbnRNaXhpbjtcbnZhciBtZXRob2RzID0ge1xuICAvLyA6OiAodHlwZTogc3RyaW5nLCBoYW5kbGVyOiAoLi4uYXJnczogW2FueV0pKSAjcGF0aD1FdmVudE1peGluLm9uXG4gIC8vIFJlZ2lzdGVyIGFuIGV2ZW50IGhhbmRsZXIgZm9yIHRoZSBnaXZlbiBldmVudCB0eXBlLlxuICBvbjogZnVuY3Rpb24gb24odHlwZSwgZikge1xuICAgIHZhciBtYXAgPSB0aGlzLl9oYW5kbGVycyB8fCAodGhpcy5faGFuZGxlcnMgPSB7fSk7XG4gICAgdmFyIGFyciA9IG1hcFt0eXBlXSB8fCAobWFwW3R5cGVdID0gW10pO1xuICAgIGFyci5wdXNoKGYpO1xuICB9LFxuXG4gIC8vIDo6ICh0eXBlOiBzdHJpbmcsIGhhbmRsZXI6ICguLi5hcmdzOiBbYW55XSkpICNwYXRoPUV2ZW50TWl4aW4ub2ZmXG4gIC8vIFVucmVnaXN0ZXIgYW4gZXZlbnQgaGFuZGxlciBmb3IgdGhlIGdpdmVuIGV2ZW50IHR5cGUuXG4gIG9mZjogZnVuY3Rpb24gb2ZmKHR5cGUsIGYpIHtcbiAgICB2YXIgYXJyID0gdGhpcy5faGFuZGxlcnMgJiYgdGhpcy5faGFuZGxlcnNbdHlwZV07XG4gICAgaWYgKGFycikgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyArK2kpIHtcbiAgICAgIGlmIChhcnJbaV0gPT0gZikge1xuICAgICAgICBhcnIuc3BsaWNlKGksIDEpO2JyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvLyA6OiAodHlwZTogc3RyaW5nLCAuLi5hcmdzOiBbYW55XSkgI3BhdGg9RXZlbnRNaXhpbi5zaWduYWxcbiAgLy8gU2lnbmFsIGFuIGV2ZW50IG9mIHRoZSBnaXZlbiB0eXBlLCBwYXNzaW5nIGFueSBudW1iZXIgb2ZcbiAgLy8gYXJndW1lbnRzLiBXaWxsIGNhbGwgdGhlIGhhbmRsZXJzIGZvciB0aGUgZXZlbnQsIHBhc3NpbmcgdGhlbSB0aGVcbiAgLy8gYXJndW1lbnRzLlxuICBzaWduYWw6IGZ1bmN0aW9uIHNpZ25hbCh0eXBlKSB7XG4gICAgdmFyIGFyciA9IHRoaXMuX2hhbmRsZXJzICYmIHRoaXMuX2hhbmRsZXJzW3R5cGVdO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHZhbHVlcyA9IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIHZhbHVlc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgaWYgKGFycikgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyArK2kpIHtcbiAgICAgIGFycltpXS5hcHBseShhcnIsIHZhbHVlcyk7XG4gICAgfVxuICB9LFxuXG4gIC8vIDo6ICh0eXBlOiBzdHJpbmcsIC4uLmFyZ3M6IFthbnldKSAjcGF0aD1FdmVudE1peGluLnNpZ25hbEhhbmRsZWFibGVcbiAgLy8gU2lnbmFsIGEgaGFuZGxlYWJsZSBldmVudCBvZiB0aGUgZ2l2ZW4gdHlwZS4gQWxsIGhhbmRsZXJzIGZvciB0aGVcbiAgLy8gZXZlbnQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLCB1bnRpbCBvbmUgb2YgdGhlbVxuICAvLyByZXR1cm5zIHNvbWV0aGluZyB0aGF0IGlzIG5vdCB0aGUgdmFsdWUgYGZhbHNlYC4gV2hlbiB0aGF0XG4gIC8vIGhhcHBlbnMsIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhhdCBoYW5kbGVyIGlzIHJldHVybmVkLiBJZiB0aGF0XG4gIC8vIGRvZXMgbm90IGhhcHBlbiwgYGZhbHNlYCBpcyByZXR1cm5lZC5cbiAgc2lnbmFsSGFuZGxlYWJsZTogZnVuY3Rpb24gc2lnbmFsSGFuZGxlYWJsZSh0eXBlKSB7XG4gICAgdmFyIGFyciA9IHRoaXMuX2hhbmRsZXJzICYmIHRoaXMuX2hhbmRsZXJzW3R5cGVdO1xuICAgIGlmIChhcnIpIHtcbiAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgdmFsdWVzID0gQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICB2YWx1ZXNbX2tleTIgLSAxXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBhcnJbaV0uYXBwbHkoYXJyLCB2YWx1ZXMpO1xuICAgICAgICBpZiAocmVzdWx0ICE9PSBmYWxzZSkgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICB9cmV0dXJuIGZhbHNlO1xuICB9LFxuXG4gIC8vIDo6ICh0eXBlOiBzdHJpbmcpIOKGkiBib29sICNwYXRoPUV2ZW50TWl4aW4uaGFzSGFuZGxlclxuICAvLyBRdWVyeSB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgaGFuZGxlcnMgZm9yIHRoaXMgZXZlbnQgdHlwZS5cbiAgaGFzSGFuZGxlcjogZnVuY3Rpb24gaGFzSGFuZGxlcih0eXBlKSB7XG4gICAgdmFyIGFyciA9IHRoaXMuX2hhbmRsZXJzICYmIHRoaXMuX2hhbmRsZXJzW3R5cGVdO1xuICAgIHJldHVybiBhcnIgJiYgYXJyLmxlbmd0aCA+IDA7XG4gIH1cbn07XG5cbi8vIDo6ICgoKSlcbi8vIEFkZCB0aGUgbWV0aG9kcyBpbiB0aGUgYEV2ZW50TWl4aW5gIGludGVyZmFjZSB0byB0aGUgcHJvdG90eXBlXG4vLyBvYmplY3Qgb2YgdGhlIGdpdmVuIGNvbnN0cnVjdG9yLlxuXG5mdW5jdGlvbiBldmVudE1peGluKGN0b3IpIHtcbiAgdmFyIHByb3RvID0gY3Rvci5wcm90b3R5cGU7XG4gIGZvciAodmFyIHByb3AgaW4gbWV0aG9kcykgaWYgKG1ldGhvZHMuaGFzT3duUHJvcGVydHkocHJvcCkpIHByb3RvW3Byb3BdID0gbWV0aG9kc1twcm9wXTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgTWFwID0gd2luZG93Lk1hcCB8fCAoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBfY2xhc3MoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIF9jbGFzcyk7XG5cbiAgICB0aGlzLmNvbnRlbnQgPSBbXTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhfY2xhc3MsIFt7XG4gICAga2V5OiBcInNldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIGZvdW5kID0gdGhpcy5maW5kKGtleSk7XG4gICAgICBpZiAoZm91bmQgPiAtMSkgdGhpcy5jb250ZW50W2ZvdW5kICsgMV0gPSB2YWx1ZTtlbHNlIHRoaXMuY29udGVudC5wdXNoKGtleSwgdmFsdWUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgICAgdmFyIGZvdW5kID0gdGhpcy5maW5kKGtleSk7XG4gICAgICByZXR1cm4gZm91bmQgPT0gLTEgPyB1bmRlZmluZWQgOiB0aGlzLmNvbnRlbnRbZm91bmQgKyAxXTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaGFzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhcyhrZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbmQoa2V5KSA+IC0xO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJmaW5kXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZpbmQoa2V5KSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29udGVudC5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICBpZiAodGhpcy5jb250ZW50W2ldID09PSBrZXkpIHJldHVybiBpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjbGVhclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgIHRoaXMuY29udGVudC5sZW5ndGggPSAwO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzaXplXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb250ZW50Lmxlbmd0aCAvIDI7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIF9jbGFzcztcbn0pKCk7XG5leHBvcnRzLk1hcCA9IE1hcDsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gc29ydGVkSW5zZXJ0O1xuXG5mdW5jdGlvbiBzb3J0ZWRJbnNlcnQoYXJyYXksIGVsdCwgY29tcGFyZSkge1xuICB2YXIgaSA9IDA7XG4gIGZvciAoOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIGlmIChjb21wYXJlKGFycmF5W2ldLCBlbHQpID4gMCkgYnJlYWs7XG4gIGFycmF5LnNwbGljZShpLCAwLCBlbHQpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdOyIsImltcG9ydCB7UHJvc2VNaXJyb3J9IGZyb20gXCIuLi8uLi8uLi9naXQvcHJvc2VtaXJyb3IvZGlzdC9lZGl0XCJcclxuaW1wb3J0IHtpbnNlcnRDU1N9IGZyb20gXCIuLi8uLi8uLi9naXQvcHJvc2VtaXJyb3IvZGlzdC9kb21cIlxyXG5pbXBvcnQgXCIuLi8uLi8uLi9naXQvcHJvc2VtaXJyb3IvZGlzdC9tZW51L3Rvb2x0aXBtZW51XCJcclxuaW1wb3J0IFwiLi4vLi4vLi4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvbWVudS9tZW51YmFyXCJcclxuaW1wb3J0IFwiLi4vLi4vLi4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvaW5wdXRydWxlcy9hdXRvaW5wdXRcIlxyXG4gICBcclxuaW1wb3J0IHtEb2MsIFRleHRibG9jaywgQmxvY2tRdW90ZSwgT3JkZXJlZExpc3QsIEJ1bGxldExpc3QsIExpc3RJdGVtLCBIb3Jpem9udGFsUnVsZSxcclxuXHRQYXJhZ3JhcGgsIEhlYWRpbmcsIFRleHQsIEhhcmRCcmVhayxcclxuXHRFbU1hcmssIFN0cm9uZ01hcmssIExpbmtNYXJrLCBDb2RlTWFyaywgU2NoZW1hLCBTY2hlbWFTcGVjfSBmcm9tIFwiLi4vLi4vLi4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvbW9kZWxcIlxyXG5cclxuaW1wb3J0IHtJbnB1dCwgVGV4dEZpZWxkLCBUZXh0QXJlYSwgQ2hlY2tCb3gsIFJhZGlvQnV0dG9uLCBTZWxlY3QsIFxyXG5cdElGcmFtZSwgSW5saW5lTWF0aCwgQmxvY2tNYXRoLCBJbWFnZSwgU3ByZWFkU2hlZXQsQ2FycnlGb3J3YXJkLFxyXG5cdENob2ljZSwgTXVsdGlwbGVDaG9pY2UsIFNjYWxlLCBDaGVja0l0ZW0sIENoZWNrTGlzdCwgV2lkZ2V0fSBmcm9tIFwiLi93aWRnZXRzXCJcclxuXHJcblxyXG5jb25zdCB3aWRnZXRzU3BlYyA9IG5ldyBTY2hlbWFTcGVjKHtcclxuXHRkb2M6IERvYyxcclxuXHRibG9ja3F1b3RlOiBCbG9ja1F1b3RlLFxyXG5cdG9yZGVyZWRfbGlzdDogT3JkZXJlZExpc3QsXHJcblx0YnVsbGV0X2xpc3Q6IEJ1bGxldExpc3QsXHJcblx0bGlzdF9pdGVtOiBMaXN0SXRlbSxcclxuXHRob3Jpem9udGFsX3J1bGU6IEhvcml6b250YWxSdWxlLFxyXG5cclxuXHRwYXJhZ3JhcGg6IFBhcmFncmFwaCxcclxuXHRoZWFkaW5nOiBIZWFkaW5nLFxyXG5cclxuXHR0ZXh0OiBUZXh0LFxyXG5cdGltYWdlOiBJbWFnZSxcclxuXHRoYXJkX2JyZWFrOiBIYXJkQnJlYWssXHJcblx0XHJcblx0aW5wdXQ6IElucHV0LFxyXG5cdHRleHRmaWVsZDogVGV4dEZpZWxkLFxyXG5cdHRleHRhcmVhOiBUZXh0QXJlYSxcclxuXHRjaGVja2JveDogQ2hlY2tCb3gsXHJcblx0cmFkaW9idXR0b246IFJhZGlvQnV0dG9uLFxyXG5cdHNlbGVjdDogU2VsZWN0LFxyXG5cdGlubGluZW1hdGg6IElubGluZU1hdGgsXHJcblx0YmxvY2ttYXRoOiBCbG9ja01hdGgsXHJcblx0aWZyYW1lOiBJRnJhbWUsXHJcblx0Y2Fycnlmb3J3YXJkOiBDYXJyeUZvcndhcmQsXHJcblx0Y2hvaWNlOiBDaG9pY2UsXHJcblx0bXVsdGlwbGVjaG9pY2U6IE11bHRpcGxlQ2hvaWNlLFxyXG5cdHNjYWxlOiBTY2FsZSxcclxuXHRjaGVja2l0ZW06IENoZWNrSXRlbSxcclxuXHRjaGVja2xpc3Q6IENoZWNrTGlzdCxcclxuXHRzcHJlYWRzaGVldDogU3ByZWFkU2hlZXQsXHJcblx0d2lkZ2V0OiBXaWRnZXRcclxufSwge1xyXG5cdGVtOiBFbU1hcmssXHJcblx0c3Ryb25nOiBTdHJvbmdNYXJrLFxyXG5cdGxpbms6IExpbmtNYXJrLFxyXG5cdGNvZGU6IENvZGVNYXJrXHJcbn0pXHJcblxyXG5jb25zdCB3aWRnZXRTY2hlbWEgPSBuZXcgU2NoZW1hKHdpZGdldHNTcGVjKVxyXG5cclxubGV0IHBtID0gd2luZG93LnBtID0gbmV3IFByb3NlTWlycm9yKHtcclxuICBwbGFjZTogZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNlZGl0b3JcIiksXHJcbiAgbWVudUJhcjogdHJ1ZSxcclxuICBkb2M6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjY29udGVudFwiKS5pbm5lckhUTUwsXHJcbiAgZG9jRm9ybWF0OiBcImh0bWxcIixcclxuICBzY2hlbWE6IHdpZGdldFNjaGVtYSxcclxuICBhdXRvSW5wdXQ6IHRydWVcclxufSlcclxuXHJcbmluc2VydENTUyhgXHJcblx0XHRcclxuZGl2LlByb3NlTWlycm9yLXNlbGVjdC1tZW51IHtcclxuICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgYmFja2dyb3VuZDogI0VFRTtcclxuICBjb2xvcjogYmxhY2s7XHJcbiAgcGFkZGluZzogMnB4IDJweDtcclxuICB6LWluZGV4OiAxNTtcclxufVxyXG5cclxuZGl2LlByb3NlTWlycm9yLXNlbGVjdC1tZW51IGRpdiB7XHJcbiAgY3Vyc29yOiBwb2ludGVyO1xyXG4gIHBhZGRpbmc6IDAgMWVtIDAgMnB4O1xyXG59XHJcblxyXG5kaXYuUHJvc2VNaXJyb3Itc2VsZWN0LW1lbnUgZGl2OmhvdmVyIHtcclxuICBiYWNrZ3JvdW5kOiB3aGl0ZTtcclxufVxyXG5cclxuZGl2LlByb3NlTWlycm9yLW1lbnUgZm9ybSB7XHJcblx0YmFja2dyb3VuZDogI0VFRTtcclxuXHR3aWR0aDogMzAwcHg7XHJcblx0Ym9yZGVyOiAxcHggc29saWQgI0FBQVxyXG59XHJcblxyXG5kaXYuUHJvc2VNaXJyb3ItbWVudSBmb3JtIHNlbGVjdCB7XHJcblx0YmFja2dyb3VuZDogd2hpdGU7XHJcbn1cclxuXHJcbmRpdi5Qcm9zZU1pcnJvci1tZW51YmFyLXNsaWRpbmcge1xyXG4gIC13ZWJraXQtdHJhbnNpdGlvbjogcmlnaHQgMC4ycyBlYXNlLW91dDtcclxuICAtbW96LXRyYW5zaXRpb246IHJpZ2h0IDAuMnMgZWFzZS1vdXQ7XHJcbiAgdHJhbnNpdGlvbjogcmlnaHQgMC4ycyBlYXNlLW91dDtcclxuICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgbGVmdDogMTAwJTtcclxuICB3aWR0aDogMTAwJTtcclxuICBib3gtc2l6aW5nOiAtbW96LWJvcmRlci1ib3g7XHJcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICBwYWRkaW5nLWxlZnQ6IDE2cHg7XHJcbiAgYmFja2dyb3VuZDogd2hpdGU7XHJcbn1cclxuXHJcblxyXG5gKVxyXG5cclxuIiwiaW1wb3J0IHtyZWFkUGFyYW1zfSBmcm9tIFwiLi4vLi4vLi4vLi4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvbWVudS9tZW51XCJcclxuaW1wb3J0IHtQb3N9IGZyb20gXCIuLi8uLi8uLi8uLi9naXQvcHJvc2VtaXJyb3IvZGlzdC9tb2RlbFwiXHJcbmltcG9ydCB7c2VsZWN0YWJsZU5vZGVBYm92ZX0gZnJvbSBcIi4uLy4uLy4uLy4uL2dpdC9wcm9zZW1pcnJvci9kaXN0L2VkaXQvc2VsZWN0aW9uXCJcclxuXHJcbmV4cG9ydCBjb25zdCBhbmRTY3JvbGwgPSB7c2Nyb2xsSW50b1ZpZXc6IHRydWV9XHJcblxyXG5NYXRoSmF4Lkh1Yi5RdWV1ZShmdW5jdGlvbiAoKSB7XHJcbiAgICBNYXRoSmF4Lkh1Yi5Db25maWcoe1xyXG4gICAgXHR0ZXgyamF4OiB7XHJcbiAgICAgICAgXHRkaXNwbGF5TWF0aDogWyBbXCJcXFxcW1wiLFwiXFxcXF1cIl0gXSwgXHJcbiAgICAgICAgXHRpbmxpbmVNYXRoOiBbIFtcIlxcXFwoXCIsXCJcXFxcKVwiXSBdLFxyXG4gICAgICAgIFx0cHJvY2Vzc0VzY2FwZXM6IHRydWVcclxuICAgIFx0fSxcclxuICAgIFx0ZGlzcGxheUFsaWduOlwibGVmdFwiXHJcblx0fSlcclxufSlcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBkZWZQYXJzZXIodHlwZSx0YWcsY2xzKSB7XHJcblx0dHlwZS5yZWdpc3RlcihcInBhcnNlRE9NXCIsIHtcclxuXHRcdHRhZzogdGFnLFxyXG5cdFx0cmFuazogMjUsXHJcblx0XHRwYXJzZTogKGRvbSwgY29udGV4dCwgdHlwZSwgYXR0cnMpID0+IHtcclxuXHRcdFx0bGV0IGNvbnRhaW5zID0gZG9tLmNsYXNzTGlzdC5jb250YWlucyhjbHMpXHJcblx0XHRcdGlmICghY29udGFpbnMpIHJldHVybiBmYWxzZVxyXG5cdFx0XHRjb250ZXh0Lmluc2VydEZyb20oZG9tLCB0eXBlLCBhdHRycylcclxuXHRcdH1cclxuXHR9KVx0XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNlbGVjdENsaWNrZWROb2RlKHBtLCBlKSB7XHJcblx0ICBsZXQgcG9zID0gc2VsZWN0YWJsZU5vZGVBYm92ZShwbSwgZS50YXJnZXQsIHtsZWZ0OiBlLmNsaWVudFgsIHRvcDogZS5jbGllbnRZfSwgdHJ1ZSlcclxuXHQgIGlmICghcG9zKSByZXR1cm4gcG0uc2VsLnBvbGxGb3JVcGRhdGUoKVxyXG5cclxuXHQgIGxldCB7bm9kZSwgZnJvbX0gPSBwbS5zZWxlY3Rpb25cclxuXHQgIGlmIChub2RlICYmIHBvcy5kZXB0aCA+PSBmcm9tLmRlcHRoICYmIHBvcy5zaG9ydGVuKGZyb20uZGVwdGgpLmNtcChmcm9tKSA9PSAwKSB7XHJcblx0ICAgIGlmIChmcm9tLmRlcHRoID09IDApIHJldHVybiBwbS5zZWwucG9sbEZvclVwZGF0ZSgpXHJcblx0ICAgIHBvcyA9IGZyb20uc2hvcnRlbigpXHJcblx0ICB9XHJcblxyXG5cdCAgcG0uc2V0Tm9kZVNlbGVjdGlvbihwb3MpXHJcblx0ICBwbS5mb2N1cygpXHJcblx0ICBlLnByZXZlbnREZWZhdWx0KClcclxuXHR9XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZGVmUGFyYW1zQ2xpY2sodHlwZSkge1xyXG5cdHR5cGUucHJvdG90eXBlLmhhbmRsZUNsaWNrID0gKHBtLCBlLCBwYXRoLCBub2RlKSA9PiB7XHJcblx0XHRsZXQgbWVudSA9IHBtLm1vZC5tZW51QmFyLm1lbnVcclxuXHRcdGxldCBjbWQgPSBwbS5jb21tYW5kc1tcImluc2VydFwiK3R5cGUubmFtZV1cclxuXHRcdGlmIChtZW51ICYmIGNtZCkge1xyXG5cdFx0XHRzZWxlY3RDbGlja2VkTm9kZShwbSxlKVxyXG5cdFx0XHRtZW51LmVudGVyKHJlYWRQYXJhbXMoY21kKSlcclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHR9IGVsc2VcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdH1cclxufVxyXG4iLCJpbXBvcnQge0Jsb2NrLCBBdHRyaWJ1dGV9IGZyb20gXCIuLi8uLi8uLi8uLi9naXQvcHJvc2VtaXJyb3IvZGlzdC9tb2RlbFwiXHJcbmltcG9ydCB7ZWx0LGluc2VydENTU30gZnJvbSBcIi4uLy4uLy4uLy4uL2dpdC9wcm9zZW1pcnJvci9kaXN0L2RvbVwiXHJcbmltcG9ydCB7ZGVmUGFyc2VyLCBkZWZQYXJhbXNDbGljaywgYW5kU2Nyb2xsfSBmcm9tIFwiLi4vdXRpbHNcIlxyXG4gXHJcbmV4cG9ydCBjbGFzcyBCbG9ja01hdGggZXh0ZW5kcyBCbG9jayB7fVxyXG5cclxuQmxvY2tNYXRoLmF0dHJpYnV0ZXMgPSB7XHJcblx0dGV4OiBuZXcgQXR0cmlidXRlKHtkZWZhdWx0OiBcIlwifSlcclxufVxyXG5cclxuZGVmUGFyc2VyKEJsb2NrTWF0aCxcImRpdlwiLFwid2lkZ2V0cy1ibG9ja21hdGhcIilcclxuXHJcbkJsb2NrTWF0aC5wcm90b3R5cGUuc2VyaWFsaXplRE9NID0gbm9kZSA9PiB7XHJcblx0aWYgKG5vZGUucmVuZGVyZWQpIHtcclxuXHRcdG5vZGUucmVuZGVyZWQgPSBub2RlLnJlbmRlcmVkLmNsb25lTm9kZSh0cnVlKVxyXG5cdH0gZWxzZSB7XHJcblx0XHRub2RlLnJlbmRlcmVkID0gZWx0KFwiZGl2XCIsIHtjbGFzczogXCJ3aWRnZXRzLWJsb2NrbWF0aFwifSwgXCJcXFxcW1wiK25vZGUuYXR0cnMudGV4K1wiXFxcXF1cIik7XHJcblx0XHQvLyB3YWl0IHVudGlsIG5vZGUgaXMgYXR0YWNoZWQgdG8gZG9jdW1lbnQgdG8gcmVuZGVyXHJcblx0XHRNYXRoSmF4Lkh1Yi5RdWV1ZShbXCJEZWxheVwiLE1hdGhKYXguQ2FsbGJhY2ssMTAwXSxbXCJUeXBlc2V0XCIsTWF0aEpheC5IdWIsbm9kZS5yZW5kZXJlZF0pXHJcblx0fVxyXG5cdHJldHVybiBub2RlLnJlbmRlcmVkOyBcclxufVxyXG5cclxuQmxvY2tNYXRoLnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XHJcblx0bmFtZTogXCJpbnNlcnRCbG9ja01hdGhcIixcclxuXHRsYWJlbDogXCJCbG9ja01hdGhcIixcclxuXHRydW4ocG0sIHRleCkge1xyXG4gICAgXHRyZXR1cm4gcG0udHIucmVwbGFjZVNlbGVjdGlvbih0aGlzLmNyZWF0ZSh7dGV4fSkpLmFwcGx5KGFuZFNjcm9sbClcclxuICBcdH0sXHJcblx0cGFyYW1zOiBbXHJcbiAgICAgXHR7IGxhYmVsOiBcIkxhdGV4IEV4cHJlc3Npb25cIiwgdHlwZTogXCJ0ZXh0XCJ9XHJcblx0XSxcclxuICAgIHByZWZpbGxQYXJhbXMocG0pIHtcclxuICAgICAgbGV0IHtub2RlfSA9IHBtLnNlbGVjdGlvblxyXG4gICAgICBpZiAobm9kZSlcclxuICAgICAgICByZXR1cm4gW25vZGUuYXR0cnMudGV4XVxyXG4gICAgfVxyXG59KVxyXG5cclxuZGVmUGFyYW1zQ2xpY2soQmxvY2tNYXRoKVxyXG5cclxuaW5zZXJ0Q1NTKGBcclxuXHJcbi53aWRnZXRzLWJsb2NrbWF0aCB7fVxyXG5cclxuYCkiLCJpbXBvcnQge0Jsb2NrLCBJbmxpbmUsIEF0dHJpYnV0ZX0gZnJvbSBcIi4uLy4uLy4uLy4uL2dpdC9wcm9zZW1pcnJvci9kaXN0L21vZGVsXCJcclxuaW1wb3J0IHtlbHQsIGluc2VydENTU30gZnJvbSBcIi4uLy4uLy4uLy4uL2dpdC9wcm9zZW1pcnJvci9kaXN0L2RvbVwiXHJcbmltcG9ydCB7ZGVmUGFyc2VyLCBkZWZQYXJhbXNDbGljaywgYW5kU2Nyb2xsfSBmcm9tIFwiLi4vdXRpbHNcIlxyXG4gXHJcbmxldCBjYXJyeU9wdGlvbnMgPSBbXVxyXG5cclxuZnVuY3Rpb24gZ2V0Q2FycnlPcHRpb25zKG5hbWVzKSB7XHJcblx0cmV0dXJuIG5hbWVzLm1hcCh3ID0+ICh7dmFsdWU6IHcsIGxhYmVsOiB3fSkpXHJcbn1cclxuIFxyXG5leHBvcnQgY2xhc3MgQ2FycnlGb3J3YXJkIGV4dGVuZHMgSW5saW5lIHt9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbkNhcnJ5Rm9yd2FyZC5hdHRyaWJ1dGVzID0ge1xyXG5cdG5hbWU6IG5ldyBBdHRyaWJ1dGUoKVxyXG59XHJcblxyXG5kZWZQYXJzZXIoQ2FycnlGb3J3YXJkLFwidGhpbmtzcGFjZVwiLFwid2lkZ2V0cy1jYXJyeWZvcndhcmRcIilcclxuXHJcbkNhcnJ5Rm9yd2FyZC5wcm90b3R5cGUuc2VyaWFsaXplRE9NID0gbm9kZSA9PiB7XHJcblx0cmV0dXJuIGVsdChcInRoaW5rc3BhY2VcIix7Y2xhc3M6IFwid2lkZ2V0cy1jYXJyeWZvcndhcmRcIiwgbmFtZTogbm9kZS5hdHRycy5uYW1lfSxcclxuXHRcdGVsdChcImltZ1wiLHtzcmM6IFwiZm9yd2FyZC5wbmdcIiwgd2lkdGg6MTYsIGhlaWdodDoxNiwgdGl0bGU6XCJDYXJyeSBmb3J3YXJkIFwiK25vZGUuYXR0cnMubmFtZX0pXHJcblx0KVxyXG59XHJcblxyXG5DYXJyeUZvcndhcmQucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcclxuXHRuYW1lOiBcImluc2VydENhcnJ5Rm9yd2FyZFwiLFxyXG5cdGxhYmVsOiBcIkNhcnJ5Rm9yd2FyZFwiLFxyXG5cdHJ1bihwbSwgbmFtZSkge1xyXG4gICAgXHRyZXR1cm4gcG0udHIucmVwbGFjZVNlbGVjdGlvbih0aGlzLmNyZWF0ZSh7bmFtZX0pKS5hcHBseShhbmRTY3JvbGwpXHJcbiAgXHR9LFxyXG5cdHBhcmFtczogW1xyXG4gICAgIFx0eyBsYWJlbDogXCJJbnB1dCBuYW1lXCIsIHR5cGU6IFwic2VsZWN0XCIsIG9wdGlvbnM6IGNhcnJ5T3B0aW9ucyB9XHJcblx0XSxcclxuICAgIHByZWZpbGxQYXJhbXMocG0pIHtcclxuICBcdFx0cG0uY29tbWFuZHMuaW5zZXJ0Q2FycnlGb3J3YXJkLnNwZWMucGFyYW1zWzBdLm9wdGlvbnMgPSBnZXRDYXJyeU9wdGlvbnMoW1widGVzdDFcIixcInRlc3QyXCJdKVxyXG5cdCAgICBsZXQge25vZGV9ID0gcG0uc2VsZWN0aW9uXHJcblx0ICAgIGlmIChub2RlKSB7XHJcblx0ICAgICAgcmV0dXJuIFtub2RlLmF0dHJzLm5hbWVdXHJcblx0ICAgIH1cclxuXHQgfVxyXG59KVxyXG5cclxuZGVmUGFyYW1zQ2xpY2soQ2FycnlGb3J3YXJkKVxyXG5cclxuaW5zZXJ0Q1NTKGBcclxuXHJcbi53aWRnZXRzLWNhcnJ5Zm9yd2FyZCB7fVxyXG5cclxuYCkiLCJpbXBvcnQge0F0dHJpYnV0ZX0gZnJvbSBcIi4uLy4uLy4uLy4uL2dpdC9wcm9zZW1pcnJvci9kaXN0L21vZGVsXCJcclxuaW1wb3J0IHtpbnNlcnRDU1N9IGZyb20gXCIuLi8uLi8uLi8uLi9naXQvcHJvc2VtaXJyb3IvZGlzdC9kb21cIlxyXG5pbXBvcnQge0lucHV0fSBmcm9tIFwiLi9pbnB1dFwiXHJcbmltcG9ydCB7ZGVmUGFyc2VyLCBkZWZQYXJhbXNDbGljaywgYW5kU2Nyb2xsfSBmcm9tIFwiLi4vdXRpbHNcIlxyXG5cclxuZXhwb3J0IGNsYXNzIENoZWNrQm94IGV4dGVuZHMgSW5wdXQge31cclxuXHJcbkNoZWNrQm94LmF0dHJpYnV0ZXMgPSB7XHJcblx0bmFtZTogbmV3IEF0dHJpYnV0ZSgpLFxyXG5cdHR5cGU6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IFwiY2hlY2tib3hcIn0pLFxyXG5cdHZhbHVlOiBuZXcgQXR0cmlidXRlKHtkZWZhdWx0OiAxfSksXHJcblx0Y2xhc3M6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IFwid2lkZ2V0cy1jaGVja2JveFwifSlcclxufVxyXG5cclxuZGVmUGFyc2VyKENoZWNrQm94LFwiaW5wdXRcIixcIndpZGdldHMtY2hlY2tib3hcIilcclxuXHJcbi8vIENoZWNrYm94IGluaGVyaXRzIHNlcmlhbGl6ZXIgZnJvbSBpbnB1dFxyXG5cclxuXHJcbkNoZWNrQm94LnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XHJcblx0bmFtZTogXCJpbnNlcnRDaGVja0JveFwiLFxyXG5cdGxhYmVsOiBcIkNoZWNrQm94XCIsXHJcblx0cnVuKHBtLCBuYW1lLCBsYWJlbCwgbG9jKSB7XHJcbiAgICBcdHJldHVybiBwbS50ci5yZXBsYWNlU2VsZWN0aW9uKHRoaXMuY3JlYXRlKHtuYW1lLCBsYWJlbCwgbG9jfSkpLmFwcGx5KGFuZFNjcm9sbClcclxuICBcdH0sXHJcblx0cGFyYW1zOiBbXHJcbiAgICAgXHR7IGxhYmVsOiBcIk5hbWVcIiwgdHlwZTogXCJ0ZXh0XCJ9LFxyXG5cdF0sXHJcbiAgICBwcmVmaWxsUGFyYW1zKHBtKSB7XHJcblx0ICAgIGxldCB7bm9kZX0gPSBwbS5zZWxlY3Rpb25cclxuXHQgICAgaWYgKG5vZGUpXHJcblx0ICAgICAgcmV0dXJuIFtub2RlLmF0dHJzLm5hbWUsIG5vZGUuYXR0cnMubGFiZWwsIG5vZGUuYXR0cnMubG9jXVxyXG5cdH1cclxufSlcclxuXHJcbmRlZlBhcmFtc0NsaWNrKENoZWNrQm94KVxyXG5cclxuaW5zZXJ0Q1NTKGBcclxuXHJcbi53aWRnZXRzLWNoZWNrYm94IHt9XHJcblxyXG5gKSIsImltcG9ydCB7QmxvY2ssIFBhcmFncmFwaCwgQXR0cmlidXRlLCBQb3N9IGZyb20gXCIuLi8uLi8uLi8uLi9naXQvcHJvc2VtaXJyb3IvZGlzdC9tb2RlbFwiXHJcbmltcG9ydCB7ZWx0LCBpbnNlcnRDU1N9IGZyb20gXCIuLi8uLi8uLi8uLi9naXQvcHJvc2VtaXJyb3IvZGlzdC9kb21cIlxyXG5pbXBvcnQge2RlZlBhcnNlciwgZGVmUGFyYW1zQ2xpY2ssIGFuZFNjcm9sbH0gZnJvbSBcIi4uL3V0aWxzXCJcclxuXHJcbmV4cG9ydCBjbGFzcyBDaGVja0l0ZW0gZXh0ZW5kcyBQYXJhZ3JhcGgge1xyXG5cdHN0YXRpYyBnZXQga2luZCgpIHsgcmV0dXJuIFwiLlwiIH1cclxuXHJcblx0Y3JlYXRlKGF0dHJzLCBjb250ZW50LCBtYXJrcykge1xyXG5cdFx0aWYgKGF0dHJzLnZhbHVlID4gMCkgY29udGVudCA9IFt0aGlzLnNjaGVtYS5ub2RlKFwiY2hlY2tib3hcIixhdHRycyldXHJcblx0XHRyZXR1cm4gc3VwZXIuY3JlYXRlKGF0dHJzLCBjb250ZW50LCBtYXJrcylcclxuXHR9XHJcbn1cclxuXHJcbkNoZWNrSXRlbS5hdHRyaWJ1dGVzID0ge1xyXG5cdG5hbWU6IG5ldyBBdHRyaWJ1dGUoKSxcclxuXHR2YWx1ZTogbmV3IEF0dHJpYnV0ZSgpXHJcbn1cclxuXHJcblxyXG5leHBvcnQgY2xhc3MgQ2hlY2tMaXN0IGV4dGVuZHMgQmxvY2sge1xyXG5cdHN0YXRpYyBnZXQgY29udGFpbnMoKSB7IHJldHVybiBcImNoZWNraXRlbVwiIH1cclxufVxyXG5cclxuQ2hlY2tMaXN0LmF0dHJpYnV0ZXMgPSB7XHJcblx0bmFtZTogbmV3IEF0dHJpYnV0ZSgpLFxyXG5cdGxheW91dDogbmV3IEF0dHJpYnV0ZSh7ZGVmYXVsdDogXCJ2ZXJ0aWNhbFwifSlcclxufVxyXG5cclxuZGVmUGFyc2VyKENoZWNrSXRlbSxcImRpdlwiLFwid2lkZ2V0cy1jaGVja2l0ZW1cIilcclxuZGVmUGFyc2VyKENoZWNrTGlzdCxcImRpdlwiLFwid2lkZ2V0cy1jaGVja2xpc3RcIilcclxuXHJcbkNoZWNrSXRlbS5wcm90b3R5cGUuc2VyaWFsaXplRE9NID0gKG5vZGUscykgPT4gcy5yZW5kZXJBcyhub2RlLFwicFwiLCB7XHJcblx0bmFtZTogbm9kZS5hdHRycy5uYW1lK1wiLVwiK25vZGUuYXR0cnMudmFsdWUsIFxyXG5cdHZhbHVlOiBub2RlLmF0dHJzLnZhbHVlLFxyXG5cdGNsYXNzOiBcIndpZGdldHMtY2hlY2tpdGVtXCJcclxufSlcclxuXHJcbkNoZWNrTGlzdC5wcm90b3R5cGUuc2VyaWFsaXplRE9NID0gKG5vZGUscykgPT4gcy5yZW5kZXJBcyhub2RlLFwiZGl2XCIse1xyXG5cdG5hbWU6IG5vZGUuYXR0cnMubmFtZSxcclxuXHRsYXlvdXQ6IG5vZGUuYXR0cnMubGF5b3V0LFxyXG5cdGNsYXNzOiBcIndpZGdldHMtY2hlY2tsaXN0XCJcclxufSlcclxuXHJcbkNoZWNrSXRlbS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xyXG5cdCAgbmFtZTogXCJzcGxpdENoZWNraXRlbVwiLFxyXG5cdCAgbGFiZWw6IFwiU3BsaXQgdGhlIGN1cnJlbnQgY2hlY2tpdGVtXCIsXHJcblx0ICBydW4ocG0pIHtcclxuXHQgICAgbGV0IHtub2RlLCBmcm9tLCB0b30gPSBwbS5zZWxlY3Rpb25cclxuXHQgICAgaWYgKChub2RlICYmIG5vZGUuaXNCbG9jaykgfHwgZnJvbS5wYXRoLmxlbmd0aCA8IDIgfHwgIVBvcy5zYW1lUGF0aChmcm9tLnBhdGgsIHRvLnBhdGgpKSByZXR1cm4gZmFsc2VcclxuXHQgICAgbGV0IHRvUGFyZW50ID0gZnJvbS5zaG9ydGVuKCksIGdyYW5kUGFyZW50ID0gcG0uZG9jLnBhdGgodG9QYXJlbnQucGF0aClcclxuXHQgICAgY29uc29sZS5sb2coZ3JhbmRQYXJlbnQudHlwZS5uYW1lKVxyXG5cdCAgICBpZiAoZ3JhbmRQYXJlbnQudHlwZS5uYW1lICE9IFwiY2hlY2tsaXN0XCIpIHJldHVybiBmYWxzZVxyXG5cdCAgICByZXR1cm4gcG0udHIuZGVsZXRlKGZyb20sIHRvKS5zcGxpdChmcm9tLCAxLCBwbS5zY2hlbWEubm9kZXMuY2hlY2tpdGVtLCB7bmFtZTogZ3JhbmRQYXJlbnQuYXR0cnMubmFtZSwgdmFsdWU6IGdyYW5kUGFyZW50LnNpemV9KS5hcHBseShhbmRTY3JvbGwpXHJcblx0ICB9LFxyXG5cdCAga2V5OiBcIkVudGVyKDUwKVwiXHJcblx0fSlcclxuXHJcblxyXG5DaGVja0xpc3QucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcclxuXHRuYW1lOiBcImluc2VydENoZWNrTGlzdFwiLFxyXG5cdGxhYmVsOiBcIkNoZWNrTGlzdFwiLFxyXG5cdHJ1bihwbSwgbmFtZSwgbGF5b3V0KSB7XHJcblx0XHRsZXQgY2hraXRlbSA9IHBtLnNjaGVtYS5ub2Rlcy5jaGVja2l0ZW0uY3JlYXRlKHtuYW1lOm5hbWUsIHZhbHVlOiAwfSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuXHRcdHJldHVybiBwbS50ci5yZXBsYWNlU2VsZWN0aW9uKHRoaXMuY3JlYXRlKHtuYW1lOm5hbWUrXCItMFwiLCBsYXlvdXQ6bGF5b3V0fSxjaGtpdGVtKSkuYXBwbHkoYW5kU2Nyb2xsKVxyXG4gIFx0fSxcclxuXHRwYXJhbXM6IFtcclxuICAgICBcdHsgbGFiZWw6IFwiTmFtZVwiLCB0eXBlOiBcInRleHRcIn0sXHJcbiAgICAgXHR7IGxhYmVsOiBcIkxheW91dCAodmVydGljYWwsIGhvcml6b250YWwpXCIsIHR5cGU6IFwic2VsZWN0XCIsIG9wdGlvbnM6IFtcclxuICAgICBcdCAgICB7dmFsdWU6IFwiaG9yaXpvbnRhbFwiLCBsYWJlbDogXCJob3Jpem9udGFsXCJ9LFxyXG4gICAgIFx0ICAgIHt2YWx1ZTogXCJ2ZXJ0aWNhbFwiLCBsYWJlbDogXCJ2ZXJ0aWNhbFwifVxyXG4gICAgIFx0ICBdfVxyXG5cdF0sXHJcbiAgICBwcmVmaWxsUGFyYW1zKHBtKSB7XHJcblx0ICAgIGxldCB7bm9kZX0gPSBwbS5zZWxlY3Rpb25cclxuXHQgICAgaWYgKG5vZGUpXHJcblx0ICAgICAgcmV0dXJuIFtub2RlLmF0dHJzLm5hbWUsIG5vZGUuYXR0cnMubGF5b3V0XVxyXG5cdCB9XHJcbn0pXHJcblxyXG5DaGVja0l0ZW0ucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcclxuICBuYW1lOiBcInNwbGl0Q2hlY2tJdGVtXCIsXHJcbiAgbGFiZWw6IFwiU3BsaXQgdGhlIGN1cnJlbnQgY2hlY2tpdGVtXCIsXHJcbiAgcnVuKHBtKSB7XHJcbiAgICBsZXQge25vZGUsIGZyb20sIHRvfSA9IHBtLnNlbGVjdGlvblxyXG4gICAgaWYgKChub2RlICYmIG5vZGUuaXNCbG9jaykgfHwgZnJvbS5wYXRoLmxlbmd0aCA8IDIgfHwgIVBvcy5zYW1lUGF0aChmcm9tLnBhdGgsIHRvLnBhdGgpKSByZXR1cm4gZmFsc2VcclxuICAgIGxldCB0b1BhcmVudCA9IGZyb20uc2hvcnRlbigpLCBncmFuZFBhcmVudCA9IHBtLmRvYy5wYXRoKHRvUGFyZW50LnBhdGgpXHJcbiAgICByZXR1cm4gcG0udHIuZGVsZXRlKGZyb20sIHRvKS5zcGxpdChmcm9tLCAxLCBwbS5zY2hlbWEubm9kZXMuY2hlY2tpdGVtLCB7XHJcbiAgICBcdG5hbWU6IGdyYW5kUGFyZW50LmF0dHJzLm5hbWUrXCItXCIrZ3JhbmRQYXJlbnQuc2l6ZSwgXHJcbiAgICBcdHZhbHVlOiBncmFuZFBhcmVudC5zaXplfSkuYXBwbHkoYW5kU2Nyb2xsKVxyXG4gIH0sXHJcbiAga2V5OiBcIkVudGVyKDUwKVwiXHJcbn0pXHJcblxyXG5DaGVja0l0ZW0ucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcclxuICBuYW1lOiBcImRlbGV0ZUNoZWNrSXRlbVwiLFxyXG4gIGxhYmVsOiBcImRlbGV0ZSB0aGlzIGNoZWNraXRlbSBvciBjaGVja2xpc3RcIixcclxuICBydW4ocG0pIHtcclxuICAgIGxldCB7aGVhZCwgZW1wdHl9ID0gcG0uc2VsZWN0aW9uXHJcbiAgICBpZiAoIWVtcHR5IHx8IGhlYWQub2Zmc2V0ID4gMSkgcmV0dXJuIGZhbHNlXHJcbiAgICAvLyBGaW5kIHRoZSBub2RlIGJlZm9yZSB0aGlzIG9uZVxyXG4gICAgbGV0IGJlZm9yZSwgY3V0XHJcbiAgICBmb3IgKGxldCBpID0gaGVhZC5wYXRoLmxlbmd0aCAtIDE7ICFiZWZvcmUgJiYgaSA+PSAwOyBpLS0pIGlmIChoZWFkLnBhdGhbaV0gPiAwKSB7XHJcbiAgICAgIGN1dCA9IGhlYWQuc2hvcnRlbihpKVxyXG4gICAgICBiZWZvcmUgPSBwbS5kb2MucGF0aChjdXQucGF0aCkuY2hpbGQoY3V0Lm9mZnNldCAtIDEpXHJcbiAgICB9XHJcblx0bGV0IG1jID0gcG0uZG9jLnBhdGgoY3V0LnBhdGgpLmNoaWxkKGN1dC5vZmZzZXQpXHJcbiAgICAvLyBpZiB0b3AgY2hvaWNlLCBkZWxldGUgd2hvbGUgcXVlc3Rpb24gaWYgb25seSBvbmUgY2hvaWNlXHJcbiAgICBpZiAobWMudHlwZS5uYW1lID09IFwiY2hlY2tpdGVtXCIpIHtcclxuICAgIFx0cmV0dXJuIHBtLnRyLmRlbGV0ZShjdXQsIGN1dC5tb3ZlKDEpKS5hcHBseShhbmRTY3JvbGwpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgXHQvLyBkb24ndCBkZWxldGUgcXVlc3Rpb24gaWYgbW9yZSB0aGFuIG9uZSBjaG9pY2VcclxuICAgIFx0aWYgKG1jLnNpemUgPT0gMSkge1xyXG4gICAgIFx0XHRyZXR1cm4gcG0udHIuZGVsZXRlKGN1dCxjdXQubW92ZSgxKSkuYXBwbHkoYW5kU2Nyb2xsKVxyXG4gICAgXHR9IGVsc2VcclxuICAgIFx0XHRyZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfSxcclxuICBrZXk6IFtcIkJhY2tzcGFjZSg1MClcIiwgXCJNb2QtQmFja3NwYWNlKDUwKVwiXVxyXG59KVxyXG5cclxuXHJcblxyXG5pbnNlcnRDU1MoYFxyXG5cclxuLndpZGdldHMtY2hlY2tpdGVtIHt9XHJcbi53aWRnZXRzLWNoZWNrbGlzdCB7fVxyXG5cclxuYCkiLCJpbXBvcnQge0Jsb2NrLCBBdHRyaWJ1dGV9IGZyb20gXCIuLi8uLi8uLi8uLi9naXQvcHJvc2VtaXJyb3IvZGlzdC9tb2RlbFwiXHJcbmltcG9ydCB7aW5zZXJ0Q1NTfSBmcm9tIFwiLi4vLi4vLi4vLi4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZG9tXCJcclxuaW1wb3J0IHtkZWZQYXJzZXIsIGRlZlBhcmFtc0NsaWNrLCBhbmRTY3JvbGx9IGZyb20gXCIuLi91dGlsc1wiXHJcblxyXG5leHBvcnQgY2xhc3MgSUZyYW1lIGV4dGVuZHMgQmxvY2sge31cclxuXHJcbklGcmFtZS5hdHRyaWJ1dGVzID0ge1xyXG5cdHNyYzogbmV3IEF0dHJpYnV0ZSh7ZGVmYXVsdDpcIlwifSksXHJcblx0d2lkdGg6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IDIwMH0pLFxyXG5cdGhlaWdodDogbmV3IEF0dHJpYnV0ZSh7ZGVmYXVsdDogMjAwfSlcclxufVxyXG5cclxuZGVmUGFyc2VyKElGcmFtZSwgXCJpZnJhbWVcIiwgXCJ3aWRnZXRzLWlmcmFtZVwiKVxyXG5cclxuSUZyYW1lLnByb3RvdHlwZS5zZXJpYWxpemVET00gPSAobm9kZSwgcykgPT4gcy5yZW5kZXJBcyhub2RlLCBcImlmcmFtZVwiLHsgXHJcblx0c3JjOiBub2RlLmF0dHJzLnNyYyxcclxuXHR3aWR0aDogbm9kZS5hdHRycy53aWR0aCxcclxuXHRoZWlnaHQ6IG5vZGUuYXR0cnMuaGVpZ2h0LFxyXG5cdGNvbnRlbnQ6IFwidGV4dC9odG1sO2NoYXJzZXQ9VVRGLThcIixcclxuXHRjbGFzczogXCJpZnJhbWVcIixcclxuXHRmcmFtZWJvcmRlcjogXCIxXCIsXHJcblx0YWxsb3dmdWxsc2NyZWVuOiBcIjFcIlxyXG59KVxyXG5cclxuSUZyYW1lLnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XHJcblx0bmFtZTogXCJpbnNlcnRJRnJhbWVcIixcclxuXHRsYWJlbDogXCJzaG93IHdlYnNpdGVzLCB5b3VUdWJlLCBHb29nbGVNYXBzLC4uLlwiLFxyXG5cdHJ1bihwbSwgc3JjLCB3aWR0aCwgaGVpZ2h0KSB7XHJcbiAgICBcdHJldHVybiBwbS50ci5yZXBsYWNlU2VsZWN0aW9uKHRoaXMuY3JlYXRlKHtzcmMsIHdpZHRoLCBoZWlnaHR9KSkuYXBwbHkoYW5kU2Nyb2xsKVxyXG4gIFx0fSxcclxuXHRwYXJhbXM6IFtcclxuICAgICBcdHsgbGFiZWw6IFwiTGluayAod2Vic2l0ZSwgeW91VHViZSwgR29vZ2xlIE1hcHMgLi4uKVwiLCB0eXBlOiBcInRleHRcIn0sXHJcbiAgICAgXHR7IGxhYmVsOiBcIldpZHRoIGluIHBpeGVsc1wiLCB0eXBlOiBcInRleHRcIiwgZGVmYXVsdDogMjAwIH0sXHJcbiAgICAgXHR7IGxhYmVsOiBcIkhlaWdodCBpbiBwaXhlbHNcIiwgdHlwZTogXCJ0ZXh0XCIsIGRlZmF1bHQ6IDIwMCB9LFxyXG5cdF0sXHJcbiAgXHRwcmVmaWxsUGFyYW1zKHBtKSB7XHJcbiAgICAgIGxldCB7bm9kZX0gPSBwbS5zZWxlY3Rpb25cclxuICAgICAgaWYgKG5vZGUpXHJcbiAgICAgICAgcmV0dXJuIFtub2RlLmF0dHJzLnNyYywgbm9kZS5hdHRycy53aWR0aCwgbm9kZS5hdHRycy5oZWlnaHRdXHJcbiAgICB9XHJcbn0pXHJcblxyXG5kZWZQYXJhbXNDbGljayhJRnJhbWUpXHJcblxyXG5pbnNlcnRDU1MoYFxyXG5cclxuLndpZGdldHMtaWZyYW1lIHt9XHJcblxyXG5gKSIsImltcG9ydCB7SW5saW5lLCBBdHRyaWJ1dGV9IGZyb20gXCIuLi8uLi8uLi8uLi9naXQvcHJvc2VtaXJyb3IvZGlzdC9tb2RlbFwiXHJcbmltcG9ydCB7ZWx0LGluc2VydENTU30gZnJvbSBcIi4uLy4uLy4uLy4uL2dpdC9wcm9zZW1pcnJvci9kaXN0L2RvbVwiXHJcbmltcG9ydCB7ZGVmUGFyc2VyLCBkZWZQYXJhbXNDbGljaywgYW5kU2Nyb2xsfSBmcm9tIFwiLi4vdXRpbHNcIlxyXG5cclxuZXhwb3J0IGNsYXNzIEltYWdlIGV4dGVuZHMgSW5saW5lIHt9XHJcbkltYWdlLmF0dHJpYnV0ZXMgPSB7XHJcbiAgc3JjOiBuZXcgQXR0cmlidXRlLFxyXG4gIGFsdDogbmV3IEF0dHJpYnV0ZSh7ZGVmYXVsdDogXCJcIn0pLFxyXG4gIHRpdGxlOiBuZXcgQXR0cmlidXRlKHtkZWZhdWx0OiBcIlwifSksXHJcbiAgY2xhc3M6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IFwid2lkZ2V0cy1pbWdcIn0pXHJcbn1cclxuXHJcbmRlZlBhcnNlcihJbWFnZSwgXCJpbWdcIiwgXCJ3aWRnZXRzLWltZ1wiKVxyXG5cclxuSW1hZ2UucHJvdG90eXBlLnNlcmlhbGl6ZURPTSA9IChub2RlLCBzKSA9PiBzLnJlbmRlckFzKG5vZGUsIFwiaW1nXCIsIG5vZGUuYXR0cnMpXHJcblxyXG5JbWFnZS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xyXG4gIG5hbWU6IFwiaW5zZXJ0SW1hZ2VcIixcclxuICBsYWJlbDogXCJJbnNlcnQgaW1hZ2VcIixcclxuICBydW4ocG0sIHNyYywgYWx0LCB0aXRsZSkge1xyXG4gICAgcmV0dXJuIHBtLnRyLnJlcGxhY2VTZWxlY3Rpb24odGhpcy5jcmVhdGUoe3NyYywgdGl0bGUsIGFsdH0pKS5hcHBseShhbmRTY3JvbGwpXHJcbiAgfSxcclxuICBwYXJhbXM6IFtcclxuICAgIHtsYWJlbDogXCJJbWFnZSBVUkxcIiwgdHlwZTogXCJ0ZXh0XCJ9LFxyXG4gICAge2xhYmVsOiBcIkRlc2NyaXB0aW9uIC8gYWx0ZXJuYXRpdmUgdGV4dFwiLCB0eXBlOiBcInRleHRcIiwgZGVmYXVsdDogXCJcIn0sXHJcbiAgICB7bGFiZWw6IFwiVGl0bGVcIiwgdHlwZTogXCJ0ZXh0XCIsIGRlZmF1bHQ6IFwiXCJ9XHJcbiAgXSxcclxuICBzZWxlY3QocG0pIHtcclxuICAgIHJldHVybiBwbS5kb2MucGF0aChwbS5zZWxlY3Rpb24uZnJvbS5wYXRoKS50eXBlLmNhbkNvbnRhaW5UeXBlKHRoaXMpXHJcbiAgfSxcclxuICBwcmVmaWxsUGFyYW1zKHBtKSB7XHJcbiAgICBsZXQge25vZGV9ID0gcG0uc2VsZWN0aW9uXHJcbiAgICBpZiAobm9kZSAmJiBub2RlLnR5cGUgPT0gdGhpcylcclxuICAgICAgcmV0dXJuIFtub2RlLmF0dHJzLnNyYywgbm9kZS5hdHRycy5hbHQsIG5vZGUuYXR0cnMudGl0bGVdXHJcbiAgfVxyXG59KVxyXG5cclxuZGVmUGFyYW1zQ2xpY2soSW1hZ2UpXHJcblxyXG5pbnNlcnRDU1MoYFxyXG5cclxuLndpZGdldHMtaW1hZ2Uge31cclxuXHJcbmApIiwiZXhwb3J0IHtCbG9ja01hdGh9IGZyb20gXCIuL2Jsb2NrbWF0aFwiXHJcbmV4cG9ydCB7Q2hlY2tCb3h9IGZyb20gXCIuL2NoZWNrYm94XCJcclxuZXhwb3J0IHtDaGVja0xpc3QsIENoZWNrSXRlbX0gZnJvbSBcIi4vY2hlY2tsaXN0XCJcclxuZXhwb3J0IHtJRnJhbWV9IGZyb20gXCIuL2lmcmFtZVwiXHJcbmV4cG9ydCB7SW5saW5lTWF0aH0gZnJvbSBcIi4vaW5saW5lbWF0aFwiXHJcbmV4cG9ydCB7SW5wdXR9IGZyb20gXCIuL2lucHV0XCJcclxuZXhwb3J0IHtNdWx0aXBsZUNob2ljZSwgQ2hvaWNlfSBmcm9tIFwiLi9tdWx0aXBsZWNob2ljZVwiXHJcbmV4cG9ydCB7UmFkaW9CdXR0b259IGZyb20gXCIuL3JhZGlvYnV0dG9uXCJcclxuZXhwb3J0IHtTY2FsZX0gZnJvbSBcIi4vc2NhbGVcIlxyXG5leHBvcnQge1NlbGVjdH0gZnJvbSBcIi4vc2VsZWN0XCJcclxuZXhwb3J0IHtUZXh0QXJlYX0gZnJvbSBcIi4vdGV4dGFyZWFcIlxyXG5leHBvcnQge1RleHRGaWVsZH0gZnJvbSBcIi4vdGV4dGZpZWxkXCJcclxuZXhwb3J0IHtJbWFnZX0gZnJvbSBcIi4vaW1hZ2VcIlxyXG5leHBvcnQge1NwcmVhZFNoZWV0fSBmcm9tIFwiLi9zcHJlYWRzaGVldFwiXHJcbmV4cG9ydCB7Q2FycnlGb3J3YXJkfSBmcm9tIFwiLi9jYXJyeWZvcndhcmRcIlxyXG5leHBvcnQge1dpZGdldH0gZnJvbSBcIi4vd2lkZ2V0XCJcclxuIiwiaW1wb3J0IHtJbmxpbmUsIEF0dHJpYnV0ZX0gZnJvbSBcIi4uLy4uLy4uLy4uL2dpdC9wcm9zZW1pcnJvci9kaXN0L21vZGVsXCJcclxuaW1wb3J0IHtlbHQsIGluc2VydENTU30gZnJvbSBcIi4uLy4uLy4uLy4uL2dpdC9wcm9zZW1pcnJvci9kaXN0L2RvbVwiXHJcbmltcG9ydCB7ZGVmUGFyc2VyLCBkZWZQYXJhbXNDbGljaywgYW5kU2Nyb2xsfSBmcm9tIFwiLi4vdXRpbHNcIlxyXG5cclxuZXhwb3J0IGNsYXNzIElubGluZU1hdGggZXh0ZW5kcyBJbmxpbmUge31cclxuXHJcbklubGluZU1hdGguYXR0cmlidXRlcyA9IHtcclxuXHR0ZXg6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IFwiXCJ9KVxyXG59IFxyXG5cclxuZGVmUGFyc2VyKElubGluZU1hdGgsIFwic3BhblwiLCBcIndpZGdldHMtaW5saW5lbWF0aFwiKVxyXG5cclxuSW5saW5lTWF0aC5wcm90b3R5cGUuc2VyaWFsaXplRE9NID0gbm9kZSA9PiB7XHJcblx0aWYgKG5vZGUucmVuZGVyZWQpIHtcclxuXHRcdG5vZGUucmVuZGVyZWQgPSBub2RlLnJlbmRlcmVkLmNsb25lTm9kZSh0cnVlKVxyXG5cdH0gZWxzZSB7XHJcblx0XHRub2RlLnJlbmRlcmVkID0gZWx0KFwic3BhblwiLCB7Y2xhc3M6IFwid2lkZ2V0cy1pbmxpbmVtYXRoXCJ9LCBcIiBcXFxcKFwiK25vZGUuYXR0cnMudGV4K1wiXFxcXCkgXCIpXHJcblx0XHQvLyB3YWl0IHVudGlsIG5vZGUgaXMgYXR0YWNoZWQgdG8gZG9jdW1lbnQgdG8gcmVuZGVyXHJcblx0XHRNYXRoSmF4Lkh1Yi5RdWV1ZShbXCJEZWxheVwiLE1hdGhKYXguQ2FsbGJhY2ssMTAwXSxbXCJUeXBlc2V0XCIsTWF0aEpheC5IdWIsbm9kZS5yZW5kZXJlZF0pXHJcblx0fVxyXG5cdHJldHVybiBub2RlLnJlbmRlcmVkO1xyXG59XHJcblxyXG5cclxuSW5saW5lTWF0aC5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xyXG5cdG5hbWU6IFwiaW5zZXJ0SW5saW5lTWF0aFwiLFxyXG5cdGxhYmVsOiBcIklubGluZU1hdGhcIixcclxuXHRydW4ocG0sIHRleCkge1xyXG4gICAgXHRyZXR1cm4gcG0udHIucmVwbGFjZVNlbGVjdGlvbih0aGlzLmNyZWF0ZSh7dGV4fSkpLmFwcGx5KGFuZFNjcm9sbClcclxuICBcdH0sXHJcblx0cGFyYW1zOiBbXHJcbiAgICAgXHR7IGxhYmVsOiBcIkxhdGV4IEV4cHJlc3Npb25cIiwgdHlwZTogXCJ0ZXh0XCIgfVxyXG5cdF0sXHJcbiAgICBwcmVmaWxsUGFyYW1zKHBtKSB7XHJcbiAgICAgIGxldCB7bm9kZX0gPSBwbS5zZWxlY3Rpb25cclxuICAgICAgaWYgKG5vZGUpXHJcbiAgICAgICAgcmV0dXJuIFtub2RlLmF0dHJzLnRleF1cclxuICAgIH1cclxufSlcclxuXHJcbmRlZlBhcmFtc0NsaWNrKElubGluZU1hdGgpXHJcblxyXG5pbnNlcnRDU1MoYFxyXG5cclxuLndpZGdldHMtaW5saW5lbWF0aCB7fVxyXG5cclxuYCkiLCJpbXBvcnQge0lubGluZSwgQXR0cmlidXRlfSBmcm9tIFwiLi4vLi4vLi4vLi4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvbW9kZWxcIlxyXG5pbXBvcnQge2luc2VydENTU30gZnJvbSBcIi4uLy4uLy4uLy4uL2dpdC9wcm9zZW1pcnJvci9kaXN0L2RvbVwiXHJcbmltcG9ydCB7ZGVmUGFyc2VyfSBmcm9tIFwiLi4vdXRpbHNcIlxyXG5cclxuZXhwb3J0IGNsYXNzIElucHV0IGV4dGVuZHMgSW5saW5lIHt9XHJcblxyXG5JbnB1dC5hdHRyaWJ1dGVzID0ge1xyXG5cdG5hbWU6IG5ldyBBdHRyaWJ1dGUoKSxcclxuXHR0eXBlOiBuZXcgQXR0cmlidXRlKHtkZWZhdWx0OiBcInRleHRcIn0pLFxyXG5cdHZhbHVlOiBuZXcgQXR0cmlidXRlKCksXHJcbn1cclxuXHJcbmRlZlBhcnNlcihJbnB1dCxcIndpZGdldHMtaW5wdXRcIilcclxuXHJcbklucHV0LnByb3RvdHlwZS5zZXJpYWxpemVET00gPSAobm9kZSxzKSA9PiBzLnJlbmRlckFzKG5vZGUsXCJpbnB1dFwiLG5vZGUuYXR0cnMpXHJcblxyXG5pbnNlcnRDU1MoYFxyXG5cdFx0XHJcbi53aWRnZXRzLWlucHV0IHt9XHJcblxyXG5gKSIsImltcG9ydCB7QmxvY2ssIFBhcmFncmFwaCwgQXR0cmlidXRlLCBQb3N9IGZyb20gXCIuLi8uLi8uLi8uLi9naXQvcHJvc2VtaXJyb3IvZGlzdC9tb2RlbFwiXHJcbmltcG9ydCB7aW5zZXJ0Q1NTfSBmcm9tIFwiLi4vLi4vLi4vLi4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZG9tXCJcclxuaW1wb3J0IHtkZWZQYXJzZXIsIGFuZFNjcm9sbH0gZnJvbSBcIi4uL3V0aWxzXCJcclxuXHJcbmV4cG9ydCBjbGFzcyBDaG9pY2UgZXh0ZW5kcyBQYXJhZ3JhcGgge1xyXG5cdHN0YXRpYyBnZXQga2luZCgpIHsgcmV0dXJuIFwiLlwiIH1cclxuXHJcblx0Y3JlYXRlKGF0dHJzLCBjb250ZW50LCBtYXJrcykge1xyXG5cdFx0aWYgKGF0dHJzLnZhbHVlID4gMCkgY29udGVudCA9IFt0aGlzLnNjaGVtYS5ub2RlKFwicmFkaW9idXR0b25cIixhdHRycyldXHJcblx0XHRyZXR1cm4gc3VwZXIuY3JlYXRlKGF0dHJzLCBjb250ZW50LCBtYXJrcylcclxuXHR9XHJcbn1cclxuXHJcbkNob2ljZS5hdHRyaWJ1dGVzID0ge1xyXG5cdG5hbWU6IG5ldyBBdHRyaWJ1dGUoKSxcclxuXHR2YWx1ZTogbmV3IEF0dHJpYnV0ZSgpXHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBNdWx0aXBsZUNob2ljZSBleHRlbmRzIEJsb2NrIHtcclxuXHRzdGF0aWMgZ2V0IGNvbnRhaW5zKCkgeyByZXR1cm4gXCJjaG9pY2VcIn1cclxufVxyXG5cclxuTXVsdGlwbGVDaG9pY2UuYXR0cmlidXRlcyA9IHtcclxuXHRuYW1lOiBuZXcgQXR0cmlidXRlKClcclxufVxyXG5cclxuXHJcbmRlZlBhcnNlcihDaG9pY2UsXCJwXCIsXCJ3aWRnZXRzLWNob2ljZVwiKVxyXG5kZWZQYXJzZXIoTXVsdGlwbGVDaG9pY2UsXCJkaXZcIixcIndpZGdldHMtbXVsdGlwbGVjaG9pY2VcIilcclxuXHJcbkNob2ljZS5wcm90b3R5cGUuc2VyaWFsaXplRE9NID0gKG5vZGUscykgPT4gcy5yZW5kZXJBcyhub2RlLFwicFwiLCB7bmFtZTogbm9kZS5hdHRycy5uYW1lLCB2YWx1ZTogbm9kZS5hdHRycy52YWx1ZSwgY2xhc3M6IFwid2lkZ2V0cy1jaG9pY2VcIn0pXHJcblxyXG5NdWx0aXBsZUNob2ljZS5wcm90b3R5cGUuc2VyaWFsaXplRE9NID0gKG5vZGUscykgPT4gcy5yZW5kZXJBcyhub2RlLFwiZGl2XCIse25hbWU6IG5vZGUuYXR0cnMubmFtZSwgY2xhc3M6IFwid2lkZ2V0cy1tdWx0aXBsZWNob2ljZVwifSlcclxuXHJcbkNob2ljZS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xyXG4gIG5hbWU6IFwic3BsaXRDaG9pY2VcIixcclxuICBsYWJlbDogXCJTcGxpdCB0aGUgY3VycmVudCBjaG9pY2VcIixcclxuICBydW4ocG0pIHtcclxuICAgIGxldCB7bm9kZSwgZnJvbSwgdG99ID0gcG0uc2VsZWN0aW9uXHJcbiAgICBpZiAoKG5vZGUgJiYgbm9kZS5pc0Jsb2NrKSB8fCBmcm9tLnBhdGgubGVuZ3RoIDwgMiB8fCAhUG9zLnNhbWVQYXRoKGZyb20ucGF0aCwgdG8ucGF0aCkpIHJldHVybiBmYWxzZVxyXG4gICAgIGxldCB0b1BhcmVudCA9IGZyb20uc2hvcnRlbigpLCBncmFuZFBhcmVudCA9IHBtLmRvYy5wYXRoKHRvUGFyZW50LnBhdGgpXHJcbiAgICBpZiAoZ3JhbmRQYXJlbnQudHlwZS5uYW1lICE9IFwibXVsdGlwbGVjaG9pY2VcIikgcmV0dXJuIGZhbHNlXHJcbiAgICByZXR1cm4gcG0udHIuZGVsZXRlKGZyb20sIHRvKS5zcGxpdChmcm9tLCAxLCBwbS5zY2hlbWEubm9kZXMuY2hvaWNlLCB7bmFtZTogZ3JhbmRQYXJlbnQuYXR0cnMubmFtZSwgdmFsdWU6IGdyYW5kUGFyZW50LnNpemV9KS5hcHBseShhbmRTY3JvbGwpXHJcbiAgfSxcclxuICBrZXk6IFwiRW50ZXIoNTApXCJcclxufSlcclxuXHJcbkNob2ljZS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xyXG4gIG5hbWU6IFwiZGVsZXRlQ2hvaWNlXCIsXHJcbiAgbGFiZWw6IFwiZGVsZXRlIHRoaXMgY2hvaWNlIG9yIG11bHRpcGxlY2hvaWNlXCIsXHJcbiAgcnVuKHBtKSB7XHJcbiAgICBsZXQge2hlYWQsIGVtcHR5fSA9IHBtLnNlbGVjdGlvblxyXG4gICAgaWYgKCFlbXB0eSB8fCBoZWFkLm9mZnNldCA+IDEpIHJldHVybiBmYWxzZVxyXG4gICAgLy8gRmluZCB0aGUgbm9kZSBiZWZvcmUgdGhpcyBvbmVcclxuICAgIGxldCBiZWZvcmUsIGN1dFxyXG4gICAgZm9yIChsZXQgaSA9IGhlYWQucGF0aC5sZW5ndGggLSAxOyAhYmVmb3JlICYmIGkgPj0gMDsgaS0tKSBpZiAoaGVhZC5wYXRoW2ldID4gMCkge1xyXG4gICAgICBjdXQgPSBoZWFkLnNob3J0ZW4oaSlcclxuICAgICAgYmVmb3JlID0gcG0uZG9jLnBhdGgoY3V0LnBhdGgpLmNoaWxkKGN1dC5vZmZzZXQgLSAxKVxyXG4gICAgfVxyXG5cdGxldCBtYyA9IHBtLmRvYy5wYXRoKGN1dC5wYXRoKS5jaGlsZChjdXQub2Zmc2V0KVxyXG4gICAgLy8gaWYgdG9wIGNob2ljZSwgZGVsZXRlIHdob2xlIHF1ZXN0aW9uIGlmIG9ubHkgb25lIGNob2ljZVxyXG4gICAgaWYgKG1jLnR5cGUubmFtZSA9PSBcImNob2ljZVwiKSB7XHJcbiAgICBcdHJldHVybiBwbS50ci5kZWxldGUoY3V0LCBjdXQubW92ZSgxKSkuYXBwbHkoKVxyXG4gICAgfSBlbHNlIHtcclxuICAgIFx0Ly8gZG9uJ3QgZGVsZXRlIHF1ZXN0aW9uIGlmIG1vcmUgdGhhbiBvbmUgY2hvaWNlXHJcbiAgICBcdGlmIChtYy5zaXplID09IDEpIHtcclxuICAgICBcdFx0cmV0dXJuIHBtLnRyLmRlbGV0ZShjdXQsY3V0Lm1vdmUoMSkpLmFwcGx5KClcclxuICAgIFx0fSBlbHNlXHJcbiAgICBcdFx0cmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH0sXHJcbiAga2V5OiBbXCJCYWNrc3BhY2UoNTApXCIsIFwiTW9kLUJhY2tzcGFjZSg1MClcIl1cclxufSlcclxuXHJcbk11bHRpcGxlQ2hvaWNlLnJlZ2lzdGVyKFwiY29tbWFuZFwiLHtcclxuXHRuYW1lOiBcImluc2VydE11bHRpcGxlQ2hvaWNlXCIsXHJcblx0bGFiZWw6IFwiTXVsdGlwbGVDaG9pY2VcIixcclxuXHRydW4ocG0sIG5hbWUpIHtcclxuICAgIFx0bGV0IHtmcm9tfSA9IHBtLnNlbGVjdGlvblxyXG5cdFx0bGV0IGNob2ljZSA9IHBtLnNjaGVtYS5ub2RlKFwiY2hvaWNlXCIse25hbWU6IG5hbWUsIHZhbHVlOiAwfSlcclxuXHRcdHBtLnRyLnJlcGxhY2VTZWxlY3Rpb24odGhpcy5jcmVhdGUoe25hbWU6IG5hbWV9LCBjaG9pY2UpKS5hcHBseShhbmRTY3JvbGwpXHJcblx0XHQvL2ZpbmQgcGF0aCBvZiBuZXh0IHNpYmxpbmdcclxuLypcdFx0bGV0IGxlbiA9IGZyb20ucGF0aC5sZW5ndGgtMVxyXG5cdFx0bGV0IHNpYiA9IGZyb20ucGF0aFtsZW5dXHJcblx0XHRsZXQgcGZyb20gPSBmcm9tLnBhdGguc3BsaWNlKDAsbGVuKS5jb25jYXQoc2liKzEpIFxyXG5cdCAgICBwbS5zZXRUZXh0U2VsZWN0aW9uKGZyb20pXHJcbiovXHJcblx0XHRyZXR1cm4gdHJ1ZVxyXG5cdH0sXHJcblx0c2VsZWN0KHBtKSB7XHJcblx0XHRjb25zb2xlLmxvZyhcInNlbGVjdFwiKVxyXG5cdFx0cmV0dXJuIHBtLmRvYy5wYXRoKHBtLnNlbGVjdGlvbi5mcm9tLnBhdGgpLnR5cGUuY2FuQ29udGFpblR5cGUodGhpcylcclxuXHR9LFxyXG5cdHBhcmFtczogW1xyXG5cdFx0eyBsYWJlbDogXCJOYW1lXCIsIHR5cGU6IFwidGV4dFwifVxyXG5cdF0sXHJcbiAgICBwcmVmaWxsUGFyYW1zKHBtKSB7XHJcblx0ICAgIGxldCB7bm9kZX0gPSBwbS5zZWxlY3Rpb25cclxuXHQgICAgaWYgKG5vZGUpXHJcblx0ICAgICAgcmV0dXJuIFtub2RlLmF0dHJzLm5hbWVdXHJcblx0IH1cclxufSlcclxuXHJcbmluc2VydENTUyhgXHJcblxyXG4ud2lkZ2V0cy1jaG9pY2Uge31cclxuLndpZGdldHMtbXVsdGlwbGVjaG9pY2Uge31cclxuXHJcbmApIiwiaW1wb3J0IHtBdHRyaWJ1dGV9IGZyb20gXCIuLi8uLi8uLi8uLi9naXQvcHJvc2VtaXJyb3IvZGlzdC9tb2RlbFwiXHJcbmltcG9ydCB7aW5zZXJ0Q1NTfSBmcm9tIFwiLi4vLi4vLi4vLi4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZG9tXCJcclxuaW1wb3J0IHtkZWZQYXJzZXJ9IGZyb20gXCIuLi91dGlsc1wiXHJcbmltcG9ydCB7SW5wdXR9IGZyb20gXCIuL2lucHV0XCJcclxuXHJcbmV4cG9ydCBjbGFzcyBSYWRpb0J1dHRvbiBleHRlbmRzIElucHV0IHt9XHJcblxyXG5SYWRpb0J1dHRvbi5hdHRyaWJ1dGVzID0ge1xyXG5cdG5hbWU6IG5ldyBBdHRyaWJ1dGUoKSxcclxuXHR0eXBlOiBuZXcgQXR0cmlidXRlKHtkZWZhdWx0OiBcInJhZGlvXCJ9KSxcclxuXHR2YWx1ZTogbmV3IEF0dHJpYnV0ZSgpLFxyXG5cdGNsYXNzOiBuZXcgQXR0cmlidXRlKHtkZWZhdWx0OiBcIndpZGdldHMtcmFkaW9idXR0b25cIn0pXHJcbn1cclxuXHJcbmRlZlBhcnNlcihSYWRpb0J1dHRvbixcImlucHV0XCIsXCJ3aWRnZXRzLXJhZGlvYnV0dG9uXCIpXHJcblxyXG4vLyBpbmhlcml0cyBzZXJpYWxpemVyIGZyb20gaW5wdXRcclxuXHJcblxyXG5pbnNlcnRDU1MoYFxyXG5cclxuLndpZGdldHMtcmFkaW9idXR0b24ge31cclxuXHJcbmApIiwiaW1wb3J0IHtCbG9jaywgQXR0cmlidXRlfSBmcm9tIFwiLi4vLi4vLi4vLi4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvbW9kZWxcIlxyXG5pbXBvcnQge2VsdCwgaW5zZXJ0Q1NTfSBmcm9tIFwiLi4vLi4vLi4vLi4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZG9tXCJcclxuaW1wb3J0IHtkZWZQYXJzZXIsIGRlZlBhcmFtc0NsaWNrLCBhbmRTY3JvbGx9IGZyb20gXCIuLi91dGlsc1wiXHJcblxyXG5leHBvcnQgY2xhc3MgU2NhbGUgZXh0ZW5kcyBCbG9jayB7fVxyXG5cclxuU2NhbGUuYXR0cmlidXRlcyA9IHtcclxuXHRuYW1lOiBuZXcgQXR0cmlidXRlKCksXHJcblx0c3RhcnR2YWx1ZTogbmV3IEF0dHJpYnV0ZSh7ZGVmYXVsdDogXCIxXCJ9KSxcclxuXHRzdGFydGxhYmVsOiBuZXcgQXR0cmlidXRlKHtkZWZhdWx0OiBcImxvd1wifSksXHJcblx0ZW5kdmFsdWU6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IFwiMTBcIn0pLFxyXG5cdGVuZGxhYmVsOiBuZXcgQXR0cmlidXRlKHtkZWZhdWx0OiBcImhpZ2hcIn0pLFxyXG59XHJcblxyXG5kZWZQYXJzZXIoU2NhbGUsXCJkaXZcIixcInNjYWxlXCIpXHJcblxyXG5TY2FsZS5wcm90b3R5cGUuc2VyaWFsaXplRE9NID0gbm9kZSA9PiB7XHJcblx0bGV0IGRvbSA9IGVsdChcImRpdlwiLHtjbGFzczogXCJ3aWRnZXRzLXNjYWxlXCJ9KVxyXG5cdGRvbS5hcHBlbmRDaGlsZChlbHQoXCJzcGFuXCIsIG51bGwsIG5vZGUuYXR0cnMuc3RhcnRsYWJlbCtcIiBcIikpXHJcblx0bGV0IHN0YXJ0VmFsID0gTnVtYmVyKG5vZGUuYXR0cnMuc3RhcnR2YWx1ZSlcclxuXHRsZXQgZW5kVmFsID0gTnVtYmVyKG5vZGUuYXR0cnMuZW5kdmFsdWUpXHJcblx0aWYgKHN0YXJ0VmFsIDwgZW5kVmFsKVxyXG5cdFx0Zm9yIChsZXQgaSA9IHN0YXJ0VmFsOyBpIDw9IGVuZFZhbDsgaSsrKSB7XHJcblx0XHRcdGRvbS5hcHBlbmRDaGlsZChcclxuXHRcdFx0XHRlbHQoXCJzcGFuXCIse2NsYXNzOiBcIndpZGdldHMtc2NhbGVpdGVtXCJ9LFxyXG5cdFx0XHRcdFx0ZWx0KFwiaW5wdXRcIix7bmFtZTpub2RlLmF0dHJzLm5hbWUsIHR5cGU6XCJyYWRpb1wiLCB2YWx1ZTppfSksXHJcblx0XHRcdFx0XHRpLnRvU3RyaW5nKClcclxuXHRcdFx0XHQpXHJcblx0XHRcdClcclxuXHRcdH1cclxuXHRlbHNlXHJcblx0XHRmb3IgKGxldCBpID0gc3RhcnRWYWw7IGkgPj0gIGVuZFZhbDsgaS0tKSB7XHJcblx0XHRcdGRvbS5hcHBlbmRDaGlsZChcclxuXHRcdFx0XHRlbHQoXCJzcGFuXCIse2NsYXNzOiBcIndpZGdldHMtc2NhbGVpdGVtXCJ9LFxyXG5cdFx0XHRcdFx0ZWx0KFwiaW5wdXRcIix7bmFtZTpub2RlLmF0dHJzLm5hbWUsIHR5cGU6XCJyYWRpb1wiLCB2YWx1ZTppfSksXHJcblx0XHRcdFx0XHRpLnRvU3RyaW5nKClcclxuXHRcdFx0XHQpXHJcblx0XHRcdClcclxuXHRcdH1cclxuXHRkb20uYXBwZW5kQ2hpbGQoZWx0KFwic3BhblwiLCBudWxsLCBcIiBcIitub2RlLmF0dHJzLmVuZGxhYmVsKSlcclxuXHRyZXR1cm4gZG9tXHJcbn1cclxuXHJcblNjYWxlLnJlZ2lzdGVyKFwiY29tbWFuZFwiLHtcclxuXHRuYW1lOiBcImluc2VydFNjYWxlXCIsXHJcblx0bGFiZWw6IFwiU2NhbGVcIixcclxuXHRydW4ocG0sIG5hbWUsIHN0YXJ0dmFsdWUsIHN0YXJ0bGFiZWwsIGVuZHZhbHVlLCBlbmRsYWJlbCkge1xyXG4gICAgXHRyZXR1cm4gcG0udHIucmVwbGFjZVNlbGVjdGlvbih0aGlzLmNyZWF0ZSh7bmFtZSxzdGFydHZhbHVlLHN0YXJ0bGFiZWwsZW5kdmFsdWUsZW5kbGFiZWx9KSkuYXBwbHkoYW5kU2Nyb2xsKVxyXG4gIFx0fSxcclxuXHRwYXJhbXM6IFtcclxuICAgICBcdHsgbGFiZWw6IFwiTmFtZVwiLCB0eXBlOiBcInRleHRcIn0sXHJcbiAgICAgXHR7IGxhYmVsOiBcIlN0YXJ0IHZhbHVlXCIsIHR5cGU6IFwidGV4dFwiLCBkZWZhdWx0OiAxfSxcclxuICAgICBcdHsgbGFiZWw6IFwiU3RhcnQgbGFiZWxcIiwgdHlwZTogXCJ0ZXh0XCIsIGRlZmF1bHQ6IFwibWluXCJ9LFxyXG4gICAgIFx0eyBsYWJlbDogXCJFbmQgdmFsdWVcIiwgdHlwZTogXCJ0ZXh0XCIsIGRlZmF1bHQ6IDEwfSxcclxuICAgICBcdHsgbGFiZWw6IFwiRW5kIGxhYmVsXCIsIHR5cGU6IFwidGV4dFwiLCBkZWZhdWx0OiBcIm1heFwifVxyXG5cdF0sXHJcbiAgICBwcmVmaWxsUGFyYW1zKHBtKSB7XHJcblx0ICAgIGxldCB7bm9kZX0gPSBwbS5zZWxlY3Rpb25cclxuXHQgICAgaWYgKG5vZGUpXHJcblx0ICAgICAgcmV0dXJuIFtub2RlLmF0dHJzLm5hbWUsIG5vZGUuYXR0cnMuc3RhcnR2YWx1ZSwgbm9kZS5hdHRycy5zdGFydGxhYmVsLCBub2RlLmF0dHJzLmVuZHZhbHVlLCBub2RlLmF0dHJzLmVuZGxhYmVsXVxyXG5cdCB9XHJcbn0pXHJcblxyXG5kZWZQYXJhbXNDbGljayhTY2FsZSlcclxuXHJcbmluc2VydENTUyhgXHJcblxyXG4ud2lkZ2V0cy1zY2FsZWl0ZW0ge31cdFx0XHJcbi53aWRnZXRzLXNjYWxlIHt9XHJcblxyXG5gKSIsImltcG9ydCB7QmxvY2ssIElubGluZSwgQXR0cmlidXRlfSBmcm9tIFwiLi4vLi4vLi4vLi4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvbW9kZWxcIlxyXG5pbXBvcnQge2VsdCwgaW5zZXJ0Q1NTfSBmcm9tIFwiLi4vLi4vLi4vLi4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZG9tXCJcclxuaW1wb3J0IHtkZWZQYXJzZXIsIGRlZlBhcmFtc0NsaWNrLCBhbmRTY3JvbGx9IGZyb20gXCIuLi91dGlsc1wiXHJcblxyXG5leHBvcnQgY2xhc3MgU2VsZWN0IGV4dGVuZHMgSW5saW5lIHt9XHJcblxyXG5TZWxlY3QuYXR0cmlidXRlcyA9IHtcclxuXHRuYW1lOiBuZXcgQXR0cmlidXRlKCksXHJcblx0b3B0aW9uczogbmV3IEF0dHJpYnV0ZSgpLFxyXG4gICAgbXVsdGlwbGU6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IFwic2luZ2xlXCJ9KVxyXG59XHJcblxyXG5kZWZQYXJzZXIoU2VsZWN0LFwic2VsZWN0XCIsXCJ3aWRnZXRzLXNlbGVjdFwiKVxyXG5cclxuU2VsZWN0LnByb3RvdHlwZS5zZXJpYWxpemVET00gPSBub2RlID0+IHtcclxuXHRsZXQgc2VsZWN0aW9uID0gbm9kZS5hdHRycy5tdWx0aXBsZSA9PSBcIm11bHRpcGxlXCJcclxuXHRsZXQgc2VsZWN0ID0gZWx0KFwic2VsZWN0XCIse25hbWU6IG5vZGUuYXR0cnMubmFtZSwgY2xhc3M6IFwid2lkZ2V0cy1zZWxlY3RcIiwgc2l6ZTogMSwgbXVsdGlwbGU6IHNlbGVjdGlvbn0pXHJcblx0bm9kZS5hdHRycy5vcHRpb25zLnNwbGl0KFwiLFwiKS5tYXAoZnVuY3Rpb24ob3B0aW9uKSB7XHJcblx0XHRzZWxlY3QuYXBwZW5kQ2hpbGQoZWx0KFwib3B0aW9uXCIsIHt2YWx1ZTogb3B0aW9uLnRyaW0oKX0sIG9wdGlvbikpXHJcblx0fSlcclxuXHRyZXR1cm4gc2VsZWN0XHJcbn1cclxuXHJcblNlbGVjdC5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xyXG5cdG5hbWU6IFwiaW5zZXJ0U2VsZWN0XCIsXHJcblx0bGFiZWw6IFwiU2VsZWN0XCIsXHJcblx0cnVuKHBtLCBuYW1lLCBvcHRpb25zLCBtdWx0aXBsZSkge1xyXG4gICAgXHRyZXR1cm4gcG0udHIucmVwbGFjZVNlbGVjdGlvbih0aGlzLmNyZWF0ZSh7bmFtZSxvcHRpb25zLG11bHRpcGxlfSkpLmFwcGx5KGFuZFNjcm9sbClcclxuICBcdH0sXHJcblx0cGFyYW1zOiBbXHJcbiAgICAgXHR7IGxhYmVsOiBcIk5hbWVcIiwgdHlwZTogXCJ0ZXh0XCJ9LFxyXG4gICAgICBcdHsgbGFiZWw6IFwiT3B0aW9ucyAoY29tbWEgc2VwYXJhdGVkKVwiLCB0eXBlOiBcInRleHRcIn0sXHJcbiAgICAgXHR7IGxhYmVsOiBcIlNlbGVjdGlvbiAoc2luZ2xlIG9yIG11bHRpcGxlKVwiLCB0eXBlOiBcInNlbGVjdFwiLCBvcHRpb25zOiBbXHJcbiAgICAgXHQgICAge3ZhbHVlOiBcIm11bHRpcGxlXCIsIGxhYmVsOlwibXVsdGlwbGVcIn0sXHJcbiAgICAgXHQgICAge3ZhbHVlOiBcInNpbmdsZVwiLCBsYWJlbDpcInNpbmdsZVwifVxyXG4gICAgIFx0XX1cclxuXHRdLFxyXG4gICAgcHJlZmlsbFBhcmFtcyhwbSkge1xyXG5cdCAgICBsZXQge25vZGV9ID0gcG0uc2VsZWN0aW9uXHJcblx0ICAgIGlmIChub2RlKSB7XHJcblx0ICAgICAgcmV0dXJuIFtub2RlLmF0dHJzLm5hbWUsIG5vZGUuYXR0cnMub3B0aW9ucywgbm9kZS5hdHRycy5tdWx0aXBsZV1cclxuXHQgICAgfVxyXG5cdCB9XHJcbn0pXHJcblxyXG5kZWZQYXJhbXNDbGljayhTZWxlY3QpXHJcblxyXG5pbnNlcnRDU1MoYFxyXG5cclxuLndpZGdldHMtc2VsZWN0IHt9XHJcblxyXG5gKSIsImltcG9ydCB7QmxvY2ssIEF0dHJpYnV0ZX0gZnJvbSBcIi4uLy4uLy4uLy4uL2dpdC9wcm9zZW1pcnJvci9kaXN0L21vZGVsXCJcclxuaW1wb3J0IHtlbHQsaW5zZXJ0Q1NTfSBmcm9tIFwiLi4vLi4vLi4vLi4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZG9tXCJcclxuaW1wb3J0IHtkZWZQYXJzZXIsIGRlZlBhcmFtc0NsaWNrLCBhbmRTY3JvbGx9IGZyb20gXCIuLi91dGlsc1wiXHJcblxyXG5leHBvcnQgY2xhc3MgU3ByZWFkU2hlZXQgZXh0ZW5kcyBCbG9jayB7fVxyXG5cclxuU3ByZWFkU2hlZXQuYXR0cmlidXRlcyA9IHtcclxuXHRkYXRhOiBuZXcgQXR0cmlidXRlKHtkZWZhdWx0OiBcIlwifSlcclxufVxyXG5cclxuZGVmUGFyc2VyKFNwcmVhZFNoZWV0LFwiZGl2XCIsXCJ3aWRnZXRzLXNwcmVhZHNoZWV0XCIpXHJcblxyXG5TcHJlYWRTaGVldC5wcm90b3R5cGUuc2VyaWFsaXplRE9NID0gbm9kZSA9PiB7XHJcblx0aWYgKG5vZGUucmVuZGVyZWQpIHtcclxuXHRcdG5vZGUucmVuZGVyZWQgPSBub2RlLnJlbmRlcmVkLmNsb25lTm9kZSh0cnVlKVxyXG5cdH0gZWxzZSB7XHJcblx0XHRub2RlLnJlbmRlcmVkID0gZWx0KFwiZGl2XCIsIHtcclxuXHRcdFx0aWQ6IFwic3ByZWFkc2hlZXRcIiwgXHJcblx0XHRcdGNsYXNzOiBcIndpZGdldHMtc3ByZWFkc2hlZXRcIlxyXG5cdFx0fSk7XHJcblx0XHQvLyB3YWl0IHVudGlsIG5vZGUgaXMgYXR0YWNoZWQgdG8gZG9jdW1lbnQgdG8gcmVuZGVyXHJcblx0XHR3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHtcclxuXHRcdFx0bGV0IGRhdGEgPSBbXHJcblx0ICAgICAgICAgICAgW1wiXCIsIFwiRm9yZFwiLCBcIlZvbHZvXCIsIFwiVG95b3RhXCIsIFwiSG9uZGFcIl0sXHJcblx0ICAgICAgICAgICAgW1wiMjAxNFwiLCAxMCwgMTEsIDEyLCAxM10sXHJcblx0ICAgICAgICAgICAgW1wiMjAxNVwiLCAyMCwgMTEsIDE0LCAxM10sXHJcblx0ICAgICAgICAgICAgW1wiMjAxNlwiLCAzMCwgMTUsIDEyLCAxM11cclxuXHQgICAgICAgIF07XHJcblx0XHJcblx0ICAgICAgICBsZXQgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NwcmVhZHNoZWV0Jyk7XHJcblx0ICAgICAgICBsZXQgaG90ID0gbmV3IEhhbmRzb250YWJsZShjb250YWluZXIsIHtcclxuXHQgICAgICAgIFx0ZGF0YTogZGF0YSxcclxuXHQgICAgICAgICAgICBtaW5TcGFyZVJvd3M6IDEsXHJcblx0ICAgICAgICAgICAgcm93SGVhZGVyczogdHJ1ZSxcclxuXHQgICAgICAgICAgICBjb2xIZWFkZXJzOiB0cnVlLFxyXG5cdCAgICAgICAgICAgIGNvbnRleHRNZW51OiB0cnVlXHJcblx0ICAgICAgICB9KTtcclxuXHRcdH0sIDEwMClcclxuXHR9XHJcblx0cmV0dXJuIG5vZGUucmVuZGVyZWQ7IFxyXG59XHJcblxyXG5TcHJlYWRTaGVldC5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xyXG5cdG5hbWU6IFwiaW5zZXJ0U3ByZWFkU2hlZXRcIixcclxuXHRsYWJlbDogXCJTcHJlYWRTaGVldFwiLFxyXG5cdHJ1bihwbSwgZGF0YSkge1xyXG4gICAgXHRyZXR1cm4gcG0udHIucmVwbGFjZVNlbGVjdGlvbih0aGlzLmNyZWF0ZSh7ZGF0YX0pKS5hcHBseShhbmRTY3JvbGwpXHJcbiAgXHR9LFxyXG5cdHBhcmFtczogW1xyXG4gICAgIFx0eyBsYWJlbDogXCJMaW5rIHRvIGRhdGEgY3N2IChmaXhlZCBmb3IgZGVtbylcIiwgdHlwZTogXCJ0ZXh0XCIsIGRlZmF1bHQ6IFwiY2Fycy5jc3ZcIn1cclxuXHRdLFxyXG4gICAgcHJlZmlsbFBhcmFtcyhwbSkge1xyXG4gICAgICBsZXQge25vZGV9ID0gcG0uc2VsZWN0aW9uXHJcbiAgICAgIGlmIChub2RlKVxyXG4gICAgICAgIHJldHVybiBbbm9kZS5hdHRycy5kYXRhXVxyXG4gICAgfVxyXG59KVxyXG5cclxuZGVmUGFyYW1zQ2xpY2soU3ByZWFkU2hlZXQpXHJcblxyXG5pbnNlcnRDU1MoYFxyXG5cclxuLndpZGdldHMtc3ByZWFkc2hlZXQge31cclxuXHJcbmApIiwiaW1wb3J0IHtCbG9jaywgQXR0cmlidXRlfSBmcm9tIFwiLi4vLi4vLi4vLi4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvbW9kZWxcIlxyXG5pbXBvcnQge2luc2VydENTU30gZnJvbSBcIi4uLy4uLy4uLy4uL2dpdC9wcm9zZW1pcnJvci9kaXN0L2RvbVwiXHJcbmltcG9ydCB7ZGVmUGFyc2VyLCBkZWZQYXJhbXNDbGljaywgYW5kU2Nyb2xsfSBmcm9tIFwiLi4vdXRpbHNcIlxyXG5cclxuZXhwb3J0IGNsYXNzIFRleHRBcmVhIGV4dGVuZHMgQmxvY2sge31cclxuXHJcblRleHRBcmVhLmF0dHJpYnV0ZXMgPSB7XHJcblx0bmFtZTogbmV3IEF0dHJpYnV0ZSgpLFxyXG5cdHJvd3M6IG5ldyBBdHRyaWJ1dGUoKSxcclxuXHRjb2xzOiBuZXcgQXR0cmlidXRlKCksXHJcblx0Y2xhc3M6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IFwid2lkZ2V0cy10ZXh0YXJlYVwifSlcclxufVxyXG5cclxuZGVmUGFyc2VyKFRleHRBcmVhLFwiaW5wdXRcIixcIndpZGdldHMtdGV4dGFyZWFcIilcclxuXHJcblRleHRBcmVhLnByb3RvdHlwZS5zZXJpYWxpemVET00gPSAobm9kZSxzKSA9PiBzLnJlbmRlckFzKG5vZGUsXCJ0ZXh0YXJlYVwiLG5vZGUuYXR0cnMpXHJcblxyXG5UZXh0QXJlYS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xyXG5cdG5hbWU6IFwiaW5zZXJ0VGV4dEFyZWFcIixcclxuXHRsYWJlbDogXCJUZXh0QXJlYVwiLFxyXG5cdHJ1bihwbSwgbmFtZSwgcm93cywgY29scykge1xyXG4gICAgXHRyZXR1cm4gcG0udHIucmVwbGFjZVNlbGVjdGlvbih0aGlzLmNyZWF0ZSh7bmFtZSxyb3dzLGNvbHN9KSkuYXBwbHkoYW5kU2Nyb2xsKVxyXG4gIFx0fSxcclxuXHRwYXJhbXM6IFtcclxuICAgICBcdHsgbGFiZWw6IFwiTmFtZVwiLCB0eXBlOiBcInRleHRcIn0sXHJcbiAgICAgXHR7IGxhYmVsOiBcIlJvd3NcIiwgdHlwZTogXCJ0ZXh0XCIsIGRlZmF1bHQ6IFwiNFwifSxcclxuICAgICBcdHsgbGFiZWw6IFwiQ29sdW1uc1wiLCB0eXBlOiBcInRleHRcIiwgZGVmYXVsdDogXCIyMFwifVxyXG5cdF0sXHJcbiAgICBwcmVmaWxsUGFyYW1zKHBtKSB7XHJcblx0ICAgIGxldCB7bm9kZX0gPSBwbS5zZWxlY3Rpb25cclxuXHQgICAgaWYgKG5vZGUpXHJcblx0ICAgICAgcmV0dXJuIFtub2RlLmF0dHJzLm5hbWUsIG5vZGUuYXR0cnMucm93cywgbm9kZS5hdHRycy5jb2xzXVxyXG5cdCB9XHJcbn0pIFxyXG5cclxuZGVmUGFyYW1zQ2xpY2soVGV4dEFyZWEpXHJcblxyXG5pbnNlcnRDU1MoYFxyXG5cclxuLndpZGdldHMtdGV4dGFyZWEge31cclxuXHJcbmApIiwiaW1wb3J0IHtBdHRyaWJ1dGV9IGZyb20gXCIuLi8uLi8uLi8uLi9naXQvcHJvc2VtaXJyb3IvZGlzdC9tb2RlbFwiXHJcbmltcG9ydCB7aW5zZXJ0Q1NTfSBmcm9tIFwiLi4vLi4vLi4vLi4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZG9tXCJcclxuaW1wb3J0IHtJbnB1dH0gZnJvbSBcIi4vaW5wdXRcIlxyXG5pbXBvcnQge2RlZlBhcnNlciwgZGVmUGFyYW1zQ2xpY2ssIGFuZFNjcm9sbH0gZnJvbSBcIi4uL3V0aWxzXCJcclxuXHJcbmV4cG9ydCBjbGFzcyBUZXh0RmllbGQgZXh0ZW5kcyBJbnB1dCB7fVxyXG5cclxuVGV4dEZpZWxkLmF0dHJpYnV0ZXMgPSB7XHJcblx0bmFtZTogbmV3IEF0dHJpYnV0ZSgpLFxyXG5cdHR5cGU6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IFwidGV4dFwifSksXHJcblx0c2l6ZTogbmV3IEF0dHJpYnV0ZSh7ZGVmYXVsdDogXCIyMFwifSksXHJcblx0Y2xhc3M6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IFwid2lkZ2V0cy10ZXh0ZmllbGRcIn0pXHJcbn1cclxuXHJcbmRlZlBhcnNlcihUZXh0RmllbGQsXCJpbnB1dFwiLFwid2lkZ2V0cy10ZXh0ZmllbGRcIilcclxuXHJcbi8vIHNlcmlhbGl6ZXIgaW5oZXJpdHMgZnJvbSBpbnB1dFxyXG5cclxuVGV4dEZpZWxkLnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XHJcblx0bmFtZTogXCJpbnNlcnRUZXh0RmllbGRcIixcclxuXHRsYWJlbDogXCJUZXh0RmllbGRcIixcclxuXHRydW4ocG0sIG5hbWUsIHNpemUpIHtcclxuICAgIFx0cmV0dXJuIHBtLnRyLnJlcGxhY2VTZWxlY3Rpb24odGhpcy5jcmVhdGUoe25hbWUsc2l6ZX0pKS5hcHBseShhbmRTY3JvbGwpXHJcbiAgXHR9LFxyXG5cdHBhcmFtczogW1xyXG4gICAgIFx0eyBsYWJlbDogXCJOYW1lXCIsIHR5cGU6IFwidGV4dFwifSxcclxuICAgICBcdHsgbGFiZWw6IFwiU2l6ZVwiLCB0eXBlOiBcInRleHRcIiwgZGVmYXVsdDogXCIyMFwiIH0sXHJcblx0XSxcclxuICAgIHByZWZpbGxQYXJhbXMocG0pIHtcclxuXHQgICAgbGV0IHtub2RlfSA9IHBtLnNlbGVjdGlvblxyXG4gXHQgICAgaWYgKG5vZGUpXHJcblx0ICAgICAgcmV0dXJuIFtub2RlLmF0dHJzLm5hbWUsIG5vZGUuYXR0cnMuc2l6ZSBdXHJcblx0IH1cclxufSlcclxuXHJcbmRlZlBhcmFtc0NsaWNrKFRleHRGaWVsZClcclxuXHJcbmluc2VydENTUyhgXHJcblxyXG4ud2lkZ2V0cy10ZXh0ZmllbGQge31cclxuXHJcbmApIiwiaW1wb3J0IHtyZWFkUGFyYW1zfSBmcm9tIFwiLi4vLi4vLi4vLi4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvbWVudS9tZW51XCJcclxuaW1wb3J0IHtUZXh0YmxvY2t9IGZyb20gXCIuLi8uLi8uLi8uLi9naXQvcHJvc2VtaXJyb3IvZGlzdC9tb2RlbFwiXHJcbmltcG9ydCB7ZWx0fSBmcm9tIFwiLi4vLi4vLi4vLi4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZG9tXCJcclxuXHJcbmNvbnN0IHdpZGdldHMgPSBbXCJJbWFnZVwiLCBcIlRleHRGaWVsZFwiLCBcIlRleHRBcmVhXCIsIFwiQ2hlY2tCb3hcIiwgXCJTZWxlY3RcIiwgXCJDYXJyeUZvcndhcmRcIixcclxuICAgICAgICAgICAgICAgICBcIklGcmFtZVwiLCBcIklubGluZU1hdGhcIiwgXCJCbG9ja01hdGhcIiwgXCJTcHJlYWRTaGVldFwiLFxyXG4gICAgICAgICAgICAgICAgIFwiTXVsdGlwbGVDaG9pY2VcIiwgXCJTY2FsZVwiLCBcIkNoZWNrTGlzdFwiXVxyXG5cclxuIGNvbnN0IGluc2VydFdpZGdldCA9IHdpZGdldHMubWFwKHcgPT4gKHtcclxuIFx0dmFsdWU6IFwiaW5zZXJ0XCIrdyxcclxuIFx0ZGlzcGxheTogKCkgPT4geyByZXR1cm4gZWx0KFwic3BhblwiLG51bGwsIHcpfVxyXG4gfSkpXHJcblxyXG5leHBvcnQgY2xhc3MgV2lkZ2V0IGV4dGVuZHMgVGV4dGJsb2NrIHt9XHJcbiBcclxuV2lkZ2V0LnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XHJcblx0bmFtZTogXCJpbnNlcnRXaWRnZXRcIixcclxuXHRsYWJlbDogXCJJbnNlcnQuLi5cIixcclxuXHRzZWxlY3QocG0pIHtyZXR1cm4gdHJ1ZX0sXHJcblx0cGFyYW1zOiBbXHJcblx0ICAgICB7bmFtZTogXCJXaWRnZXQgdHlwZVwiLCB0eXBlOiBcInNlbGVjdFwiLCBvcHRpb25zOiBpbnNlcnRXaWRnZXQsIGRlZmF1bHRMYWJlbDogXCJJbnNlcnQuLi5cIn1cclxuXHRdLFxyXG5cdHJ1bihwbSwgdHlwZSkge1xyXG5cdFx0bGV0IG1lbnUgPSBwbS5tb2QubWVudUJhci5tZW51XHJcblx0XHRsZXQgY21kID0gcG0uY29tbWFuZHNbdHlwZV1cclxuXHRcdGlmIChtZW51ICYmIGNtZCkgbWVudS5lbnRlcihyZWFkUGFyYW1zKGNtZCkpXHJcblx0fSxcclxuXHRkaXNwbGF5OiBcInNlbGVjdFwiLFxyXG5cdG1lbnVHcm91cDogXCJibG9ja1wiLFxyXG5cdG1lbnVSYW5rOiA5OVxyXG59KVxyXG5cclxuIFxyXG4iXX0=